在Linux终端中,如何删除一个目录中除一个或两个以外的所有文件
在Linux终端中,如何从文件夹中删除除一个或两个文件以外的所有文件 比如说 我在一个目录中有100个图像文件和一个txt文件。在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
我想删除除
.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
的身份尝试了这个命令,但没有成功。我必须在许多目录上运行这个命令。假设Idirectory
对于以ls
开头的命令有同级的directory2,directory3
@Bilal,是的,它将在当前目录中执行该任务。如果使用find
命令,则可以列出所需的任意多个目录作为'path'
。在选项1中,grep
需要在此处具有--line regexp
参数,否则/bin/w
将匹配/bin/which
.epic。清楚的回答。非常感谢。