Удалить файлы определенного типа, сохранить дерево каталогов

Я пытаюсь переместить несколько файлов .doc и .xls, которые хранятся в нескольких папках и подпапках, в новое место. Ранее я пытался cp -r **/{*.doc,*.xls} /wherever/you/want/, который работал, за исключением того, что он не сохранял дерево каталогов быстрее.

Вопрос: Существует ли команда / набор команд для очистки всех файлов, кроме .doc и .xls, в папке и ее подпапках, но при этом сохраняется структура дерева каталогов? И что еще лучше, есть ли команда для удаления пустых папок, так что мне не придется потом проходить и вручную удалять пустые папки?

3
задан 14 April 2014 в 01:18

3 ответа

Можно использовать 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 {} \;

Дополнительную информацию см. в этом вопросе на том, что находит, делает и как использовать его.

8
ответ дан 14 April 2014 в 01:18

Это требует некоторого довольно причудливого синтаксиса 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
0
ответ дан 14 April 2014 в 01:18

Это должно сделать все сразу:

find path/to/dir '!' -iname "*.doc" '!' -iname "*.xls" -empty -delete

(За исключением того, что у ваших папок есть такие расширения, как .xls или doc ...)

Заменить -delete на [ 114], чтобы увидеть, что удаляется первым.

0
ответ дан 14 April 2014 в 01:18

Другие вопросы по тегам:

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