我可以使用find directory/ -type f ! -name 'string' -delete
删除除directory
中与模式string
匹配的文件之外的所有文件。但是,我在保存多个模式时遇到了麻烦。例如,考虑directory
,其内容为:
string1_1
string2_1
string3_1
string4_1
sdfsdv2_1
我想删除除string1_1、string2_1和string3_1之外的所有内容。我尝试了几种方法,但最接近的是find directory/ -type f ! -name 'string1_'||'string2_'||'string3_' -delete
。这将正确执行查找,但打印文件名而不是删除它们。也就是说,它打印:
string4_1
sdfsdv2_1
要在一行中完成此操作,我可以做哪些修改?显然存在多行的变通方法,比如将find
输出存储在文本文件中,然后在此基础上执行rm
-ing操作,但我想在一行中完成此操作。
这里有几个使用脚本的答案,但这似乎只是一个好的单行答案的表面。如果这个问题已经逐字回答过了,我错过了,所以请链接。
2条答案
按热度按时间krcsximq1#
使用bash的扩展模式:
将
printf '%s\n'
更改为rm
,如果输出看起来像要删除的文件列表。它不会像
find
那样下降到子目录中。n3schb8v2#
find directory/ -type f ! -name 'string1_'||'string2_'||'string3_' -delete
这句话是“find files not named string 1_,and**execute a command named string 2_**if find exits non-zero”
||
不是find语法,它是bash语法。链接测试的(GNU)find语法是用
-o
连接它们。要测试文件是否匹配模式A或B,可以使用-name A -o -name B
。要测试逆运算,你可以将整个表达式用括号括起来并求反:! \( -name A -o -name B \)
。在您的特定情况下,您可以用途:
find directory/ -type f ! \( -name 'string1_*' -o -name 'string2_*' -o -name 'string3_*' \) -delete