Как переместить файл рекурсивно на основе размера и структуры

Я хочу переместить файлы размером более 300 Мб из одного дерева каталогов, где каждый файл находится в подпапках

Пример: у меня есть структура каталогов:

dirA/ dirA/file1 dirA/x/ dirA/x/file2 dirA/y/ dirA/y/file3 

Вот ожидаемый результат, «перемещение» дерева каталогов, в котором каждый файл перемещен в подпапки:

 dirB/ # normal directory dirB/file1 # moved from dirA/file1 dirB/x/ # normal directory dirB/x/file2 # moved from dirA/x/file2 dirB/y/ # normal directory dirB/y/file3 # moved from dirA/y/file3 

find /path/ -type f -size +300m но что тогда? и, к сожалению, некоторые из файлов имеют всевозможные символы, которые вы можете найти на своей клавиатуре.

Я смотрел эту тему, где кто-то говорит о cpio но я не знаю, что программа …

PS: У вас установлен GNU Parallel, если это может ускорить работу?

4 Solutions collect form web for “Как переместить файл рекурсивно на основе размера и структуры”

Легкий способ – с zsh . Вы можете использовать квалификаторы glob для соответствия файлам в соответствии с такими критериями, как их тип и размер. Шаблон подстановки **/ соответствует любому уровню подкаталогов. Модификаторы истории h и t – это простые способы извлечения каталога и базовой части имени файла. Вызовите mkdir -p для создания каталогов по мере необходимости.

 cd dirA for x in **/*(.Lm+300); do mkdir -p ../dirB/$x:h && mv -- $x ../dirB/$x done 

Портативный способ – find . Используйте -exec для вызова фрагмента оболочки для каждого файла.

 cd dirA find . -type f -size +300000k -exec sh -c 'for x do mkdir -p "../dirB/${x%/*}" mv "$x" "../dirB/$x" done' sh {} + 

Параллелизация редко используется для ввода / вывода: она позволяет вам использовать преимущества нескольких процессоров, но CPU редко является узким местом в I / O.

Perl rename – это очевидный выбор. Он может быть установлен как ren , rename или pren :

 find dirA -type f -size +300M | ren 's:^dirA/:dirB/:' 

Однако он не работает, если файлы перемещаются в другую точку монтирования и не сработает, если там нет.

Параллель с GNU будет медленнее:

 cd dirA find . -type f -size +300M | parallel mkdir -p ../dirB/{//} find . -type f -size +300M | parallel mv {} ../dirB/{} 

но будет работать, даже если ему нужно выполнить процедуру copy-then-remove, чтобы получить файлы в другую файловую систему.

Вкратце:

 find dirA -type f -size +300m -printf "mv %p dirB/%P\n" | sh 

Но все подкаталоги в dirB должны существовать до начала. По этой причине я предлагаю вам выполнить следующие два шага:

 cd dirA find . -type f -size +300m -printf "mkdir -p ../dirB/%h\nmv %p ../dirB/%P\n" | sh 

Что касается cpio (на самом деле он решает проблему подкаталогов):

 (cd dirA; find . -type f -size +300m) | cpio -p -md dirB 

(Что касается cp (1) в том же потоке, о котором вы говорите, это не хорошо для вас, потому что он скопирует все файлы и создаст подкаталог с именем dirA под dirB. Флаг -T может решить эту проблему)

Это должно покрыть его.

 find /path -type f -size +300m | while read A ; do DEST=${A/dirA/dirB} ; echo mkdir -p $(dirname $DEST) 2>/dev/null; echo mv $A $DEST ; done 

Запустите его как есть, сначала, проверку работоспособности, и, если вы довольны предлагаемыми командами, запустите его без элементов echo .

В вашем примере структуры файла будут созданы следующие команды

 mkdir -p ./dirB mv ./dirA/file1 ./dirB/file1 mkdir -p ./dirB/x mv ./dirA/x/file2 ./dirB/x/file2 mkdir -p ./dirB/y mv ./dirA/y/file3 ./dirB/y/file3 
  • Вызовите сценарий Linux с языка сценариев
  • Гибридный код в сценариях оболочки. Обмен переменными
  • Сценарий Bash для tar - Указание проблемы
  • Открытие терминала, отличного от xterm, запуск команды на нем и не закрытие терминала после его успешного завершения
  • скопируйте раздел данных из stdin
  • Как я могу автоматически перезапустить gnome-shell, выходящий из режима приостановки?
  • Как программно изменить режим командного режима Vim?
  • grep для текста, который может или не может присутствовать
  • BASH | Отчет формата CSV
  • Почему мой скрипт медленно использует все больше и больше памяти? Это из-за мидори?
  • Как разобрать вывод для конкретного ответа (создание атрибута расширения для JAMF JSS)
  • Interesting Posts

    Существуют ли дополнительные группы root, которые отличаются от обычных учетных записей для акций NFS?

    Как может порядок выполнения в оболочке, относящийся к перенаправлению, расстраиваться примерно 1 раз из 1000 в моей системе?

    Как запустить программу в чистой среде в bash?

    Обмен терминалом с несколькими пользователями (с экраном или иным способом)

    Используйте `/ etc / paths` или` / etc / paths.d` для добавления элементов в PATH в macOS Sierra?

    Текстовые аннотации и добавления изображений в PDF-файл с использованием бесплатного программного обеспечения

    Пользовательская установка кикстарта завершается, но машина не загружается

    как увидеть изменения, сделанные в большом скрипте perl, имеющем копию оригинала, который должен одновременно сравнивать как в разделенном gvim-редакторе

    Отсутствие Fedora в grub после установки Ubuntu

    Редактирование файла Spec в RPM

    Как создать копию файла в нескольких каталогах?

    Как сделать мой диск отключенным в ожидании нечитаемых секторов

    Как получить вывод `yum list` для останова на одной строке при получении вывода через удаленную команду ssh?

    Оценить часть текстовой строки

    Терминал на Mac Osx – похоже, не ищет скрипты в PATH env var

    Linux и Unix - лучшая ОС в мире.