我有一些格式如下的输出:
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
以进行空运行。