简单的问题,但我对 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
(以及该做什么)?