shell 使用bash从目录中删除除少数模式匹配的文件以外的所有文件的一行程序?

rryofs0p  于 2023-06-24  发布在  Shell
关注(0)|答案(2)|浏览(100)

我可以使用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操作,但我想在一行中完成此操作。
这里有几个使用脚本的答案,但这似乎只是一个好的单行答案的表面。如果这个问题已经逐字回答过了,我错过了,所以请链接。

krcsximq

krcsximq1#

使用bash的扩展模式:

shopt -s extglob
printf '%s\n' !(string[123]_1)

printf '%s\n'更改为rm,如果输出看起来像要删除的文件列表。
它不会像find那样下降到子目录中。

n3schb8v

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

相关问题