ls (大引号) 将它们与 grep “捆绑” 然后用 rm 所有在一个命令中找到的匹配项...这可以实现吗?

ls (大引号) 将它们与 grep “捆绑” 然后用 rm 所有在一个命令中找到的匹配项...这可以实现吗?

简单的问题,但我对 bash 命令管道的熟练程度还不够,无法完全实现我的愿望。希望能找到我正在寻找的命令,如果不是,那么也许我可以温习一下文献,以完成我的任务。这是我的问题 + 我迄今为止尝试过的方法:所以我有一个二手硬盘,有一些(怀疑的好处)异常遗留,它们的名称作为文件名,这使得现在我的硬盘无法实现这一点。我能够访问根挂载点,并找到了我想要删除的文件,使用 ''' ls -A | grep abcdef ''' 有没有办法将 grep 列表通过管道传输到 '''rm -f''' 命令,因为当我尝试 '''ls -A | grep abcdef | rm''' 时,它并没有完全起作用。在那次巨大的失败之后(你到底在 rm 什么?!)我尝试了 ''' ls -A | grep abcdef <| rm ''' 以及许多其他类似库存的迭代,但无济于事。同样,我并不一定想要“简单的答案”,但也许一个确切的位置,在那里我可以获得一些有限的输出重定向帮助会很棒。(我自己回答了吗?之后将它放到 /dev/null 会满足我的需要吗?...我会尝试,但希望一些命令重定向帮助不会有什么坏处)任何帮助都将不胜感激,谢谢。

答案1

管道 ( |) 将一个进程的标准输出流连接到另一个进程的标准输入流。您不能使用它直接传递文件名列表rm,因为rm它不会从其标准输入读取文件名。

可以使用该xargs程序读取列表它是标准输入,并“捆绑”文件名rm

ls -A | grep abcdef | xargs rm

但不要,这种方法存在各种问题 - 特别是grep逐行处理输入,而xargs默认情况下按空格拆分输入。您可以使用类似

shopt -s dotglob # simulate ls -A "almost all" hidden files
printf '%s\0' * | grep -z abcdef | xargs -0 rm

它使用 ASCII 空字符明确地分隔文件名。通常首选的方法是使用以下命令find

find . -maxdepth 1 -name '*abcdef*' # -delete

-delete(我暂时保留了注释 -find在取消注释之前请务必确保它是正确的文件,因为没有“撤消”操作)。

请注意,find默认情况下会递归到子目录中 - 如果您想要等效于ls -R则删除-maxdepth 1。您可以添加-type f以查找和删除文件(省略目录)。

还要注意,find -name使用 shell glob 模式而不是所使用的正则表达式grep(它也有一个-regex匹配谓词,但在这里似乎没有必要)。

也可以看看为什么不是解析ls(以及该做什么)?

相关内容