如何从unix上的索引中删除grep输出中的单个文件?

时间:2014-08-10 06:02:37

标签: bash unix grep

我的系统上有一个奇怪的文件。当我寻找一个名字时(让我们说foo),我明白了:

kilojoules@kilojoules:~$ ls|grep "foo"
foo
foo foo
kilojoules@kilojoules:~$ 

我无法删除文件" foo foo"不删除:foo:。是否可以只将一个grep输出管道输出到xargs?类似ls|grep "foo"|xargs[1] rmls|grep "foo" [1]|xargs rm

的内容

3 个答案:

答案 0 :(得分:2)

使用双引号或单引号来封装您的参数:

rm "foo foo"
rm 'foo foo'

你也可以引用空格:

rm foo\ foo

如果您的文件参数以-开头,请在其前面添加额外的--,以防止rm将其解释为无效选项:

rm -- "--foo"

Quoting。或者更好的是整个Basic Shell Features部分。

答案 1 :(得分:1)

@konsolebox建议的内容绝对简单,甚至我也经常这样做,但在* nix系统中,你总是可以期待奇怪的文件名,即使不是不可能使用双/单引号方法删除也很困难。对于这种情况,最好找到inode number然后使用find命令删除它。 find命令有delete开关用于此类目的。

[gc@slave ~]$ ls -li
total 8
19214 -rw-rw-r-- 1 gc gc   0 Aug 10 11:35 foo
35660 -rw-rw-r-- 1 gc gc   0 Aug 10 11:35 foo foo

[gc@slave ~]$ find . -type f -inum 35660 -delete

[gc@slave ~]$ ls -ltr
total 8
-rw-rw-r-- 1 gc gc   0 Aug 10 11:35 foo

答案 2 :(得分:0)

您可以使用tail选择最后一行:

ls *foo* | tail -n 1 | xargs rm

或者您可以使用sed打印第二个:

ls *foo* | sed -n 2p | xargs rm

或者您可以按内容grep将其删除:

ls *foo* | grep 'foo.*foo' | xargs rm

这些恶作剧都不是真的有必要,而且所有这些都属于discouraged practice of parsing ls output,但是回答你的问题希望教你一些关于管道的事情。