命令行以递归方式搜索目录中所有文本文件中的所有文件

时间:2015-10-07 16:18:16

标签: wordpress bash shell grep

我刚刚迁移到Octopress。在迁移过程中,插件从WordPress下载了大量未使用的图像,现在我正在尝试删除它。

我想列出所有图片并搜索_post文件夹中的所有文件,并将所有未使用的文件提供给我,以便删除它们。

我想出了这个命令。

find ./ -type f | xargs basename | xargs grep -r {} ../_posts/

我不认为这是正确的。它给了我这个结果。

grep: Screenshot-2015-07-30-13.04.35.png: No such file or directory
grep: Screenshot-2015-07-30-13.05.41-150x116.png: No such file or directory
grep: Screenshot-2015-07-30-13.05.41.png: No such file or directory
grep: Screenshot-2015-07-30-13.06.33-150x150.png: No such file or directory
grep: Screenshot-2015-07-30-13.06.33-231x300.png: No such file or directory
grep: Screenshot-2015-07-30-13.06.33-518x500.png: No such file or directory
grep: Screenshot-2015-07-30-13.06.33-518x592.png: No such file or directory
grep: Screenshot-2015-07-30-13.06.33.png: No such file or directory
grep: Screenshot-2015-07-30-13.07.47-1024x601.png: No such file or directory
grep: Screenshot-2015-07-30-13.07.47-1120x500.png: No such file or directory
grep: Screenshot-2015-07-30-13.07.47-150x150.png: No such file or directory
grep: Screenshot-2015-07-30-13.07.47-300x176.png: No such file or directory
grep: Screenshot-2015-07-30-13.07.47-786x592.png: No such file or directory
grep: Screenshot-2015-07-30-13.07.47.png: No such file or directory

因为即使正在使用的文件仍然列出。

1 个答案:

答案 0 :(得分:1)

那是因为你并没有限制xargs有多少行

find ./ -type f | xargs basename | xargs grep -r {} ../_posts/

xargs会用很多字符串生成grep,你会得到

grep -r foo bar baz qux ../_posts/

由于grep只想要一个模式,所以其余的都假定为文件名。

快速解决方法是

find ./ -type f | xargs -L 1 basename | xargs -L 1 grep -r {} ../_posts/

我会在没有xargs的情况下重写:

find ./ -type f -printf "%f\n" | grep -rFf - ../_posts/

这样,您可以获得一次查找呼叫和一次grep呼叫。应该快得多。

由于grep -f -不起作用,更复杂的bash进程替换(请参阅bash手册页)

grep -rFf <(find ./ -type f -exec basename '{}' \;) ../_posts/

这会将find输出转换为grep可以使用-f选项读取的文件。