删除某些类型的文件,保留目录树

删除某些类型的文件,保留目录树

我正在尝试将存储在多个文件夹和子文件夹中的一堆 .doc 和 .xls 文件移动到新位置。我之前尝试过cp -r **/{*.doc,*.xls} /wherever/you/want/,效果不错,只是保留目录树的速度没有更快。

问题:是否有命令/命令集可以清除文件夹及其子文件夹中除 .doc 和 .xls 之外的所有文件,但保留目录树结构?更好的是,是否有命令可以删除空文件夹,这样我就不必事后再手动删除空文件夹了?

答案1

您可以使用该find命令。这些命令旨在从里面保存 .xls 和 .doc 文件(以及其他目录)的目录。请勿在您的主目录上运行此程序!

最简单的方法是删除所有非 xls 和非 doc 文件(小心,此命令将要删除所有其他文件):

find ./ -type f -not -name "*.xls" -and -not -name "*.doc" -exec rm {} \;

然后,您可以使用它来查找和删除空目录。为了避免使用可能非常具有破坏性的rm -rf,它一次删除一个级别,您可能需要运行它几次才能删除所有空目录:

find ./ -type d -empty -exec rmdir {} \;

这个问题了解有关 find 的功能及其使用方法的更多详细信息。

答案2

这应该可以一次性完成所有事情:

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

(除非您的文件夹具有类似.xlsdoc...的扩展名)

替换-delete-print,查看首先删除的内容。

答案3

这需要一些相当花哨的 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

相关内容