使用"rm"命令和反向匹配

7

我想要删除在我的文件列表中与R1.fastq.gz不匹配的所有文件。如何使用反向匹配来使用rm命令?


这个问题在SO上不属于主题范围。使用rm是不可能的,你需要使用类似于findrm的组合:在Linux中如何删除除了*.txt模式之外的所有文件? - t.niese
1
或者 bashextglob 特性 - 也在您链接的答案中提到。 - Arkadiusz Drabczyk
3个回答

14

使用在 bash 中可用的扩展模式语法:

shopt -s extglob
printf '%s\n' !(R1.fastq.gz)  # To verify the list of files the pattern matches
rm !(R1.fastq.gz)  # To actually remove them.

或者使用 find

find . ! -name R1.fastq.gz -print         # Verify
find . ! -name R1.fastq.gz -exec rm {} +  # Delete

如果您的find版本支持它,可以使用-delete代替-exec rm {} +

find . ! -name R1.fastq.gz -delete

0
ls | grep -v "file_with_string_you_dont_want_to_delete" | xargs rm -f

-1
您可能需要 "反向匹配" 选项,即 grep -v,该选项意味着 "选择不与正则表达式匹配的行。",然后将它们删除。
类似这样的命令:rm $(ls | grep -v -e"R1.fastq.gz") 应该可以做到。
请注意,这将删除您所在文件夹中的所有文件,除了 R1.fastq.gz

如果你想排除多个文件,可以在右括号之前添加 -e "name",例如 rm $(ls | grep -v -e "file1" -e "file2" -e "file3") - ingroxd
直接去监狱,不要解析ls,也不要收取200美元。 - chepner
1
请参阅[BashPitfalls#1](http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29)和[为什么不应解析`ls`的输出](http://mywiki.wooledge.org/ParsingLs)。如果您使用`touch'hello * world.txt'创建文件,则此代码将扩展`作为全局通配符并删除目录中的所有内容,*包括 R1.fastq.gz 文件。 - Charles Duffy
“R1.fastq.gz”不可能通过“touch”命令创建,由于OP必须删除除白名单文件以外的所有内容,唯一的坏情况是他有一些名为“/usr/bin/something”的文件… 在这里使用“ls”是完全合法的,但这只是我的个人意见,你可以有不同的想法[:] - ingroxd
完美运作 :) 但肯定有一些哲学上的理由不这样做 :P - Esben Eickhardt
@EsbenEickhardt 是的,随着时间的推移,我开始避免以任何方式解析 ls,即使我仍然认为两年前所说的话:在某些情况下,使用和解析它是完全安全的[:] - ingroxd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接