У меня есть библиотека документов, в которой все мои файлы находятся в папках, основанных на названии категории, но также они также находятся во вложенных папках, называемых «pdf». Есть ли способ в bash сканировать все каталоги в библиотеке и перемещать все файлы в папках с именем pdf в их родительский каталог?
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
чтобы запросить подтверждение перед перезаписью чего-либо.
Вот что я подумала. Это не самая красивая вещь, но она работает в соответствии с вашими требованиями:
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