С Bash, Как найти все каталоги с двумя каталогами и переместить их в скопированную древовидную структуру?

Формат NTFS был бы лучшим вариантом.

Вы можете отформатировать USB-накопитель с помощью встроенного в окно инструмента, который может находиться в меню правой кнопки мыши.

Итак, щелкните правой кнопкой мыши USB-накопитель, и это должно быть так же просто, как выбрать «формат» и выбрать «NTFS».

1
задан 5 October 2017 в 20:43

9 ответов

Если вы хотите обновить деревья каталогов с помощью другого места, лучшим инструментом будет rsync, второй вариант, возможно, tar. Написание сценария оболочки часто бывает излишним:

rsync -aP --ignore-existing Original/ Copy

Опции:

-a сообщает rsync о сохранении прав собственности, режимов и т. Д. [F6] печатает информацию о ходе [ f7] означает, что файлы, уже находящиеся в Copy, не будут затронуты. Конечная / после Original сообщает rsync копировать содержимое Original в Copy, а не копировать Original.

Удалите Original, когда закончите, или используйте опцию --remove-source-files files, чтобы rsync удалял файлы, когда это делается, копируя их.

2
ответ дан 22 May 2018 в 17:49

Здесь вы можете перемещать каталоги без подкаталогов.

Сначала включите рекурсивное подталкивание:

shopt -s globstar

Теперь вы можете глобализовать рекурсивно с помощью **. Вы можете отключить его с помощью shopt -u globstar, но при следующем открытии оболочки он будет выключен.

Теперь в родительском каталоге как Copy, так и Original:

[ f2]

Удалите echo после тестирования, чтобы фактически переместить каталоги (и их содержимое конечно - mv не имеет флага -r)

Давайте сделаем это более читаемым

shopt -s globstar
for d in Original/**/; do 
    $(ls -lAq "$d" | grep -q '^d') || 
    echo mv -vn -- "$d" Copy"${d/Original/}"
done

Подождите, я просто проанализировал вывод ls? Да, да. Но я думаю, что все в порядке (!), Так как я думаю, что могу положиться на последовательность вывода в этом случае. Независимо от того, какие символы содержит имя файла, вывод ls -l в каталоге, где находится этот файл, начинается со строки, которая определяет его тип и разрешения. В ls -l все списки каталогов начинаются с d, например

drwxrwxr-x 26 zanna zanna 4096 Oct  5 19:57 playground

Даже новые строки не испортили это, так как они отображаются как ? (даже после трубопровода), если мы добавим -q.

$(ls -lAq "$d" | grep -q '^d') 

проверяет, что в каталоге есть некоторые подкаталоги. Вместо сбора данных из grep мы собираем статус выхода. Если команда выполнена успешно, мы ничего не делаем, но если она терпит неудачу, мы mv находим каталог (используя || или оператор, что означает, что если команда до || терпит неудачу, выполните одно за ней).

Мы используем строковые манипуляции для удаления Original, поэтому каталоги копируются в нужные места в Copy.

Вот результат:

$ tree
.
├── Copy
│   ├── Dir1
│   │   ├── Objects
│   │   └── Textures
│   ├── Dir2
│   │   ├── SubDir1
│   │   │   └── SubSubDir1
│   │   │       ├── Objects
│   │   │       └── Textures
│   │   └── SubDir2
│   │       ├── Objects
│   │       └── Textures
│   └── Dir3
│       ├── Objects
│       ├── SubDir1
│       │   ├── Objects
│       │   └── Textures
│       └── Textures
└── Original
    ├── Dir1
    ├── Dir2
    │   ├── SubDir1
    │   │   └── SubSubDir1
    │   └── SubDir2
    └── Dir3
        └── SubDir1
1
ответ дан 22 May 2018 в 17:49

Вот пример того, как это может сработать для вас. Обратите внимание, что этот скрипт должен запускаться на том же уровне, что и исходные и скопированные каталоги, а также, возможно, он нуждается в адаптации к вашим фактическим потребностям. Удачи.

#!/bin/bash

src="original" 
dst="./copy"

function findLocation {
    for i in `find $src/ -type d -name "$1"`; do
        IFS='/' read -ra directories <<< "$i"
        dirNum=${#directories[@]}
        let "arrayNum=$dirNum-2"

        arrs=()

        for ((k=1 ; k<=$arrayNum; k++)); do
            arrs+=("${directories[$k]}")
        done

        echo "===============================++++++++++++++++"

        function join {
            local IFS="$1"
            shift
            echo "$*"
        }

        constructDst=`join / ${arrs[@]}`
        destination="$dst/$constructDst/"

        if [ ! -d $destination ] ; then
            mkdir -p $destination
            echo "creating directory: $destination"
        fi

        if [ -d $i ]; then
            echo "Moving $i to $destination"
            mv $i -t $destination
        fi
    done
}

findLocation Textures 
findLocation Objects
0
ответ дан 22 May 2018 в 17:49

Если вы хотите обновить деревья каталогов с помощью другого места, лучшим инструментом будет rsync, второй вариант, возможно, tar. Написание сценария оболочки часто бывает излишним:

rsync -aP --ignore-existing Original/ Copy

Опции:

-a сообщает rsync о сохранении прав собственности, режимов и т. Д. [F6] печатает информацию о ходе --ignore-existing означает, что файлы, уже находящиеся в Copy, не будут затронуты. Конечная / после Original сообщает rsync копировать содержимое Original в Copy, а не копировать Original.

Удалите Original, когда закончите, или используйте опцию --remove-source-files files, чтобы rsync удалял файлы, когда это делается, копируя их.

2
ответ дан 18 July 2018 в 05:42

Вот пример того, как это может сработать для вас. Обратите внимание, что этот скрипт должен запускаться на том же уровне, что и исходные и скопированные каталоги, а также, возможно, он нуждается в адаптации к вашим фактическим потребностям. Удачи.

#!/bin/bash src="original" dst="./copy" function findLocation { for i in `find $src/ -type d -name "$1"`; do IFS='/' read -ra directories <<< "$i" dirNum=${#directories[@]} let "arrayNum=$dirNum-2" arrs=() for ((k=1 ; k<=$arrayNum; k++)); do arrs+=("${directories[$k]}") done echo "===============================++++++++++++++++" function join { local IFS="$1" shift echo "$*" } constructDst=`join / ${arrs[@]}` destination="$dst/$constructDst/" if [ ! -d $destination ] ; then mkdir -p $destination echo "creating directory: $destination" fi if [ -d $i ]; then echo "Moving $i to $destination" mv $i -t $destination fi done } findLocation Textures findLocation Objects
0
ответ дан 18 July 2018 в 05:42

Здесь вы можете перемещать каталоги без подкаталогов.

Сначала включите рекурсивное подталкивание:

shopt -s globstar

Теперь вы можете глобализовать рекурсивно с помощью **. Вы можете отключить его с помощью shopt -u globstar, но при следующем открытии оболочки он будет выключен.

Теперь в родительском каталоге как Copy, так и Original:

for d in Original/**/; do $(ls -lAq "$d" | grep -q '^d') || echo mv -vn -- "$d" Copy"${d/Original/}"; done

Удалите echo после тестирования, чтобы фактически переместить каталоги (и их содержимое конечно - mv не имеет флага -r)

Давайте сделаем это более читаемым

shopt -s globstar for d in Original/**/; do $(ls -lAq "$d" | grep -q '^d') || echo mv -vn -- "$d" Copy"${d/Original/}" done

Подождите, я просто проанализировал вывод ls? Да, да. Но я думаю, что все в порядке (!), Так как я думаю, что могу положиться на последовательность вывода в этом случае. Независимо от того, какие символы содержит имя файла, вывод ls -l в каталоге, где находится этот файл, начинается со строки, которая определяет его тип и разрешения. В ls -l все списки каталогов начинаются с d, например

drwxrwxr-x 26 zanna zanna 4096 Oct 5 19:57 playground

Даже новые строки не испортили это, так как они отображаются как ? (даже после трубопровода), если мы добавим -q.

$(ls -lAq "$d" | grep -q '^d')

проверяет, что в каталоге есть некоторые подкаталоги. Вместо сбора данных из grep мы собираем статус выхода. Если команда выполнена успешно, мы ничего не делаем, но если она терпит неудачу, мы mv находим каталог (используя || или оператор, что означает, что если команда до || терпит неудачу, выполните одно за ней).

Мы используем строковые манипуляции для удаления Original, поэтому каталоги копируются в нужные места в Copy.

Вот результат:

$ tree . ├── Copy │   ├── Dir1 │   │   ├── Objects │   │   └── Textures │   ├── Dir2 │   │   ├── SubDir1 │   │   │   └── SubSubDir1 │   │   │   ├── Objects │   │   │   └── Textures │   │   └── SubDir2 │   │   ├── Objects │   │   └── Textures │   └── Dir3 │   ├── Objects │   ├── SubDir1 │   │   ├── Objects │   │   └── Textures │   └── Textures └── Original ├── Dir1 ├── Dir2 │   ├── SubDir1 │   │   └── SubSubDir1 │   └── SubDir2 └── Dir3 └── SubDir1
1
ответ дан 18 July 2018 в 05:42

Если вы хотите обновить деревья каталогов с помощью другого места, лучшим инструментом будет rsync, второй вариант, возможно, tar. Написание сценария оболочки часто бывает излишним:

rsync -aP --ignore-existing Original/ Copy

Опции:

-a сообщает rsync о сохранении прав собственности, режимов и т. Д. [F6] печатает информацию о ходе --ignore-existing означает, что файлы, уже находящиеся в Copy, не будут затронуты. Конечная / после Original сообщает rsync копировать содержимое Original в Copy, а не копировать Original.

Удалите Original, когда закончите, или используйте опцию --remove-source-files files, чтобы rsync удалял файлы, когда это делается, копируя их.

2
ответ дан 24 July 2018 в 18:25

Вот пример того, как это может сработать для вас. Обратите внимание, что этот скрипт должен запускаться на том же уровне, что и исходные и скопированные каталоги, а также, возможно, он нуждается в адаптации к вашим фактическим потребностям. Удачи.

#!/bin/bash src="original" dst="./copy" function findLocation { for i in `find $src/ -type d -name "$1"`; do IFS='/' read -ra directories <<< "$i" dirNum=${#directories[@]} let "arrayNum=$dirNum-2" arrs=() for ((k=1 ; k<=$arrayNum; k++)); do arrs+=("${directories[$k]}") done echo "===============================++++++++++++++++" function join { local IFS="$1" shift echo "$*" } constructDst=`join / ${arrs[@]}` destination="$dst/$constructDst/" if [ ! -d $destination ] ; then mkdir -p $destination echo "creating directory: $destination" fi if [ -d $i ]; then echo "Moving $i to $destination" mv $i -t $destination fi done } findLocation Textures findLocation Objects
0
ответ дан 24 July 2018 в 18:25

Здесь вы можете перемещать каталоги без подкаталогов.

Сначала включите рекурсивное подталкивание:

shopt -s globstar

Теперь вы можете глобализовать рекурсивно с помощью **. Вы можете отключить его с помощью shopt -u globstar, но при следующем открытии оболочки он будет выключен.

Теперь в родительском каталоге как Copy, так и Original:

for d in Original/**/; do $(ls -lAq "$d" | grep -q '^d') || echo mv -vn -- "$d" Copy"${d/Original/}"; done

Удалите echo после тестирования, чтобы фактически переместить каталоги (и их содержимое конечно - mv не имеет флага -r)

Давайте сделаем это более читаемым

shopt -s globstar for d in Original/**/; do $(ls -lAq "$d" | grep -q '^d') || echo mv -vn -- "$d" Copy"${d/Original/}" done

Подождите, я просто проанализировал вывод ls? Да, да. Но я думаю, что все в порядке (!), Так как я думаю, что могу положиться на последовательность вывода в этом случае. Независимо от того, какие символы содержит имя файла, вывод ls -l в каталоге, где находится этот файл, начинается со строки, которая определяет его тип и разрешения. В ls -l все списки каталогов начинаются с d, например

drwxrwxr-x 26 zanna zanna 4096 Oct 5 19:57 playground

Даже новые строки не испортили это, так как они отображаются как ? (даже после трубопровода), если мы добавим -q.

$(ls -lAq "$d" | grep -q '^d')

проверяет, что в каталоге есть некоторые подкаталоги. Вместо сбора данных из grep мы собираем статус выхода. Если команда выполнена успешно, мы ничего не делаем, но если она терпит неудачу, мы mv находим каталог (используя || или оператор, что означает, что если команда до || терпит неудачу, выполните одно за ней).

Мы используем строковые манипуляции для удаления Original, поэтому каталоги копируются в нужные места в Copy.

Вот результат:

$ tree . ├── Copy │   ├── Dir1 │   │   ├── Objects │   │   └── Textures │   ├── Dir2 │   │   ├── SubDir1 │   │   │   └── SubSubDir1 │   │   │   ├── Objects │   │   │   └── Textures │   │   └── SubDir2 │   │   ├── Objects │   │   └── Textures │   └── Dir3 │   ├── Objects │   ├── SubDir1 │   │   ├── Objects │   │   └── Textures │   └── Textures └── Original ├── Dir1 ├── Dir2 │   ├── SubDir1 │   │   └── SubSubDir1 │   └── SubDir2 └── Dir3 └── SubDir1
1
ответ дан 24 July 2018 в 18:25

Другие вопросы по тегам:

Похожие вопросы: