У меня есть библиотека документов, в которой все мои файлы находятся в папках, основанных на названии категории, но также они также находятся во вложенных папках, называемых «pdf». Есть ли способ в bash сканировать все каталоги в библиотеке и перемещать все файлы в папках с именем pdf в их родительский каталог?

2 ответа2

2

Следующее перемещает каждый файл из папки pdf в родительский каталог.

find ~/some/folder -type d -name 'pdf' -print0 | while IFS= read -d '' dir
do
  find "$dir" -type f -maxdepth 1 -exec echo mv -- {} "$dir"/.. \;
done

Уберите echo только вы убедитесь, что оно делает то, что вам нужно.

Обратите внимание, что это будет перезаписывать файлы, не спрашивая, когда родитель уже содержит один с тем же именем. Используйте mv -i чтобы запросить подтверждение перед перезаписью чего-либо.

1

Вот что я подумала. Это не самая красивая вещь, но она работает в соответствии с вашими требованиями:

find . -ipath "*pdf/*.pdf" -type f -print0 | xargs -0 -I{} sh -c 'mv "{}" "$(dirname "{}")"/..'

Он перемещает только файлы .pdf в подпапках pdf в соответствующие родительские каталоги. Чтобы изменить команду для перемещения всех файлов в подпапках pdf , измените аргумент ipath на *pdf/* .


Пример использования

$ find .
.
./category1
./category1/other_dir
./category1/other_dir/c1o1.txt
./category1/pdf
./category1/pdf/c1p1.pdf
./category1/pdf/c1p2.pdf
./category1/pdf/c1p3.pdf
./category2
./category2/other_dir
./category2/other_dir/c2o1.txt
./category2/pdf
./category2/pdf/c2p1.pdf
./category2/pdf/c2p2.pdf
./category2/pdf/c2p3.pdf

$ find . -ipath "*pdf/*.pdf" -type f -print0 | xargs -0 -I{} sh -c 'mv "{}" "$(dirname "{}")"/..'
.
./category1
./category1/c1p1.pdf
./category1/c1p2.pdf
./category1/c1p3.pdf
./category1/other_dir
./category1/other_dir/c1o1.txt
./category1/pdf
./category2
./category2/c2p1.pdf
./category2/c2p2.pdf
./category2/c2p3.pdf
./category2/other_dir
./category2/other_dir/c2o1.txt
./category2/pdf

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .