Разделение большого дерева каталогов типом файла

Это означает, что некоторый процесс имеет рабочий каталог или открытый дескриптор файла под точкой монтирования. Лучшая вещь сделать состоит в том, чтобы закончить незаконный процесс, изменить его рабочий каталог или закрыть дескриптор файла перед размонтированием.

На Linux существует альтернатива все же. Используя umount -l называет "ленивое" размонтирование. Файловая система будет все еще смонтирована, но Вы не сможете видеть или использовать ее, за исключением процессов, которые уже используют ее. Когда незаконная программа выйдет (через любые средства), система "закончит" размонтировать файловую систему.

3
03.08.2011, 02:56
2 ответа

Один способ сделать это должно было бы использовать rsync с некоторыми особенно обработанными включают/исключают правила и опцию удалить исходные файлы после синхронизации как это:

rsync -av --include "*/" --include='*.fits' --include='*.sdf' \
    --exclude='*' --remove-source-files /data/ /raw_data/

Если Вы хотели переместить пошаговый цикл INA так, чтобы Вы могли потенциально включать другие действия, Вам будет нужен сценарий, который делает что-то вроде этого:

DIR1="/data"
DIR2="/raw_data"

find "$DIR1" -type f \( -iname '*.fits' -or -iname '*.sdf' \) -print0 |
    while read -d $'\0' file; do
        mkdir -p "$DIR2/$(basename "$file")"
        mv "$file" "$DIR2/$(basename "$file")"
    done
4
27.01.2020, 21:13
  • 1
    @strmqm rsync решение лучше, чем то, которое я предложил, потому что это является более общим. Это будет работать на любую структуру каталогов, тогда как мой принимает и hardcodes фиксированное 1 расположение уровня как в примере. Можно пропустить find ... -delete и сделайте все это за один шаг с rsync's --remove-source-files опция. –  jw013 02.08.2011, 15:48
  • 2
    @jw013: я забыл о --remove-source-files, спасибо. –  Caleb 02.08.2011, 16:24

Существует набор инструментов копирования файла, которые позволяют создавать целевое имя каталога с достаточно гибкими правилами (zcp, rsync, pax, …). К сожалению, немногие из них позволяют оба перемещения (в противоположность копированию) и создание целевых каталогов по требованию. Таким образом, я покажу, что некоторые пути делают это в двух передачах: сначала создайте все потенциально необходимые целевые каталоги, затем выполните перемещение.

Perl переименовывает

Perl rename программа, поставленная Debian и Ubuntu, может создать целевой каталог при необходимости, если Вы пишете необходимый бит Perl.

shopt -s globstar       # make **/ traverse directories recursively (requires bash 4)
rename 'BEGIN {use File::Path}
        s!^/data!/raw_data!;
        m!(.*)/!; mkpath($1)' /data/**/*.raw

В zsh опустите shopt -s globstar строка; ** означает рекурсивный обход по умолчанию. В оболочках кроме удара и zsh, необходимо использовать find для рекурсивных обходов (см. примеры ниже). Не волнуйтесь обо всем этом, если у Вас есть единственный уровень каталогов.

Создание целевых каталогов

В zsh (объяснение: / спецификатор шарика означает соответствовать только каталогам, и e спецификатор шарика применяет преобразование, данное впоследствии каждому имени):

mkdir /data/**/*(/e\''REPLY=${REPLY/data/raw_data}'\')

С другими оболочками:

find /data -type d \
     -exec sh -c 'for d; do mkdir "/raw_data${d#/data}"; done' _ {} +

Если у Вас только есть один уровень подкаталогов, это намного более просто:

for d in /data/*/; do mkdir "/raw_data${d#/data}"; done

Перемещение файлов (zsh)

autoload zmv
zmv -Q '/data/(**/)(*.raw)(.)' '/raw_data/$1$2'

Перемещение (портативных) файлов

find /data -name '*.raw' \
     -exec sh -c 'for x; do mv "$x" "/raw_data${x#/data}"; done' _ {} +
3
27.01.2020, 21:13

Теги

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