在Linux终端中,如何删除目录中除一个或两个以外的所有文件

时间:2014-02-14 12:23:06

标签: linux shell ubuntu filesystems

在Linux终端中,如何从一个或两个文件夹中删除所有文件?

例如。

我在目录中有 100 图像文件和一个 .txt 文件。 我想删除除 .txt 文件以外的所有文件。

5 个答案:

答案 0 :(得分:31)

从目录中列出文件,过滤掉所有不包含“要保留的文件”的文件,并删除列表中剩余的所有文件。

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个名称

答案 1 :(得分:8)

通常,使用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 {} \;

答案 2 :(得分:4)

查找支持-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

答案 3 :(得分:3)

使用not修饰符删除您不想删除的file(s)pattern(s),您可以修改传递给1的{​​{1}}以指定您要从

中删除多少个子目录
-maxdepth

你也可以这样做:

find . -maxdepth 1 -not -name "*.txt" -exec rm -f {} \;

答案 4 :(得分:2)

在bash中,您可以使用:

$ shopt -s extglob  # Enable extended pattern matching features    
$ rm !(*.txt)       # Delete all files except .txt files