[英]In Linux terminal, how to delete all files in a directory except one or two
在Linux终端中,如何从一个或两个文件夹中删除所有文件?
例如。
我在一个目录中有100个图像文件和一个.txt
文件。 我想删除除.txt
文件以外的所有文件。
在目录中,列出文件,过滤掉所有不包含'file-to-keep'的文件,并删除列表中剩余的所有文件。
ls | grep -v 'file-to-keep' | xargs rm
为避免文件名中的空格出现问题(请记住永远不要在文件名中使用空格),请使用find
和-0
选项。
find 'path' -maxdepth 1 -not -name 'file-to-keep' -print0 | xargs -0 rm
或混合两种,使用grep
选项-z
管理-print0
从名称find
通常,使用grep的反向模式搜索应该可以完成这项工作。 由于您没有定义任何模式,我只是给您一个通用的代码示例:
ls -1 | grep -v 'name_of_file_to_keep.txt' | xargs rm -f
ls -1
每行列出一个文件,以便grep可以逐行搜索。 grep -v
是倒置标志。 因此,任何匹配的模式都不会被删除。
对于多个文件,您可以使用egrep:
ls -1 | grep -E -v 'not_file1.txt|not_file2.txt' | xargs rm -f
问题更新后更新:我假设您愿意删除除当前文件夹中不以.txt
结尾的文件之外的所有文件。 所以这也应该有效:
find . -maxdepth 1 -type f -not -name "*.txt" -exec rm -f {} \;
find支持-delete
选项,因此您不需要-exec
。 您还可以传递多组-not -name somefile -not -name otherfile
user@host$ ls
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt josh.pdf keepme
user@host$ find . -maxdepth 1 -type f -not -name keepme -not -name 8.txt -delete
user@host$ ls
8.txt keepme
使用not
修饰符删除您不想删除的file(s)
或pattern(s)
,您可以修改传递给-maxdepth
的1
,以指定要从中删除文件的深度子目录数
find . -maxdepth 1 -not -name "*.txt" -exec rm -f {} \;
你也可以这样做:
find -maxdepth 1 \! -name "*.txt" -exec rm -f {} \;
在bash中,您可以使用:
$ shopt -s extglob # Enable extended pattern matching features
$ rm !(*.txt) # Delete all files except .txt files
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.