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

在Linux终端中,如何删除一个目录中除一个或两个以外的所有文件,linux,shell,ubuntu,filesystems,Linux,Shell,Ubuntu,Filesystems,在Linux终端中,如何从文件夹中删除除一个或两个文件以外的所有文件 比如说 我在一个目录中有100个图像文件和一个txt文件。 我想删除除.txt文件以外的所有文件。从目录中列出文件,过滤掉所有不包含“要保留的文件”,并删除列表中剩余的所有文件 ls | grep -v 'file-to-keep' | xargs rm 要避免文件名中出现空格问题(请记住不要在文件名中使用空格),请使用find和-0选项 find 'path' -maxdepth 1 -not -name 'file-to

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

比如说

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

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

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 {} \;

使用
not
修饰符删除不想删除的
文件
模式
,您可以修改传递给
-maxdepth
1
以指定要从中删除文件的子目录深度

find . -maxdepth 1 -not -name "*.txt" -exec rm -f {} \;
您还可以执行以下操作:

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

“查找”支持
-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
在bash中,可以使用:

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

除了哪一个或两个?您最好展示一些异常应该是什么样子的模式。否则我们只能给出一个非常笼统的答案。如果filenames.Works中有空格,这可能会有问题。我必须在当前目录中才能成功执行此命令。对吗?我以
sudo ls directory/directory/directory1/|grep-v'readme.txt'| xargs rm
的身份尝试了这个命令,但没有成功。我必须在许多目录上运行这个命令。假设I
directory
对于以
ls
开头的命令有同级的
directory2,directory3
@Bilal,是的,它将在当前目录中执行该任务。如果使用
find
命令,则可以列出所需的任意多个目录作为
'path'
。在选项1中,
grep
需要在此处具有
--line regexp
参数,否则
/bin/w
将匹配
/bin/which
.epic。清楚的回答。非常感谢。