如何使用 grep 和/或 awk 选择文件中的多个路径名并删除这些文件?

如何使用 grep 和/或 awk 选择文件中的多个路径名并删除这些文件?

我有一些格式如下的输出:

foo: /some/long/path_with_underscores-and-hyphens/andnumbers1.ext exists in filesystem
foo: /another/one.ext exists in filesystem
bar: /another/path/and/file.2 exists in filesystem

我需要删除这些文件。如何提取每个路径并删除文件?我知道awk可以捕获路径,因为它始终是行中的第二个元素,但我不知道从哪里开始捕获它们并将它们输入到像rm.

答案1

简单的awk+xargs方法:

awk '{ print $2 }' file | xargs -n1 rm

答案2

除了其他答案:

您的文件路径是否包含空格?如果是的话就需要妥善处理。尝试使用此命令通过 GNU sed 获取正确的文件路径:

sed -r 's/^.*: (.*)/\1/;s/^(.*) exists in filesystem$/\1/' file

或者 POSIX:

sed -e 's/^.*: \(.*\)/\1/' -e 's/^\(.*\) exists in filesystem$/\1/' file

如果你有这样的文件:

foo: /some/long/path_with_underscores-and-hyphens/andnumbers1.ext exists in filesystem
foo: /another/one.ext exists in filesystem
bar: /another/path/and/file.2 exists in filesystem
123 ret: /another/path/and/file 2 exists in filesystem
123 ret: /another/space path/and/file 2 exists in filesystem

你的输出将是:

/some/long/path_with_underscores-and-hyphens/andnumbers1.ext
/another/one.ext
/another/path/and/file.2
/another/path/and/file 2
/another/space path/and/file 2

要删除文件,请xargs如上所述使用,但带有-d选项:

sed pattern | xargs -n1 -d '\n' rm

答案3

具有awk及其system()功能。

awk '{ system("echo rm "$2) }' list

当你的文件名中没有空格时,上面是正确的,如果你尝试下面的方法。

awk '{gsub(/^.*: | exists in filesystem$/,""); system("echo rm \"" $0"\"")}' list

请注意,上述方法都无法检测文件名中的换行符(如果有)。

删除echo以进行空运行。

相关内容