Я пытаюсь переместить несколько файлов .doc и .xls, которые хранятся в нескольких папках и подпапках, в новое место. Ранее я пытался cp -r **/{*.doc,*.xls} /wherever/you/want/
, который работал, за исключением того, что он не сохранял дерево каталогов быстрее.
Вопрос: Существует ли команда / набор команд для очистки всех файлов, кроме .doc и .xls, в папке и ее подпапках, но при этом сохраняется структура дерева каталогов? И что еще лучше, есть ли команда для удаления пустых папок, так что мне не придется потом проходить и вручную удалять пустые папки?
Можно использовать find
команда. Эти команды предназначены, чтобы быть выполненными из каталога, где Ваш .xls и .doc файлы (и другие каталоги) сохранены. НЕ выполняйте это на своем корневом каталоге!
Самый легкий способ сделать это удаляет весь non-xls и файлы недокумента (ОСТОРОЖНЫЙ, эта команда удалит все другие файлы):
find ./ -type f -not -name "*.xls" -and -not -name "*.doc" -exec rm {} \;
Затем можно использовать это, чтобы найти и удалить пустые каталоги. Избегать использования потенциально очень разрушительного rm -rf
, это удаляет один уровень за один раз, Вам, вероятно, придется выполнить его несколько раз для удаления всех пустых каталогов:
find ./ -type d -empty -exec rmdir {} \;
Дополнительную информацию см. в этом вопросе на том, что находит, делает и как использовать его.
Это требует некоторого довольно причудливого синтаксиса rsync, но это можно сделать:
rsync -r --filter="+ */" --filter="+ **/*.xls" --filter="+ **/*.doc" --filter="- **" --prune-empty-dirs /path/to/source/ /path/to/target/
Демонстрация:
me@banshee:/tmp$ find source
source
source/1.xls
source/1
source/1/2
source/1/2/2.xls
source/1/1.doc
source/lol.crapfile
me@banshee:/tmp$ find target
target
me@banshee:/tmp$ rsync -r --filter="+ */" --filter="+ **/*.xls" --filter="+ **/*.doc" --filter="- **" --prune-empty-dirs source/ target/
me@banshee:/tmp$ find target
target
target/1.xls
target/1
target/1/2
target/1/2/2.xls
target/1/1.doc
Это должно сделать все сразу:
find path/to/dir '!' -iname "*.doc" '!' -iname "*.xls" -empty -delete
(За исключением того, что у ваших папок есть такие расширения, как .xls
или doc
...)
Заменить -delete
на [ 114], чтобы увидеть, что удаляется первым.