我试图仅列出非图像文件,仅搜索最近的 500 个文件。所以我跑
ls -t | head -500 | file | grep -v 'image'
这是不对的:它显示一条帮助消息。将其更改为
ls -t | head -500 | xargs file | grep -v 'image'
现在,我有时会得到我想要的输出,但如果文件名中包含空格(例如)Plutonian\ Nights\ -\ Sun\ Ra.mp3
,xargs
则将运行file Plutonian
、file Nights
等。
我如何帮助xargs
看到空间,或者以其他方式完成我想要完成的事情?
答案1
使用xargs
,可以这样完成:
find . -type f -print0 | xargs -0 file | grep -v 'image'
但xargs
昨天就是这样。今天很酷的孩子们都在使用parallel
。使用并行,它将是:
find . -type f | parallel file | grep -v 'image'
看。不使用 -print0 和 -0。parallel
它本身确实很聪明。
更新
要仅列出最近的 500 个文件,您的命令是:
ls -1t | head -500 | parallel file {} | grep -v image
重要的
如果您的并行程序是旧的并且上述语法不起作用,请按照此处的说明安装新版本的并行程序:http://www.gnu.org/software/parallel/parallel_tutorial.html
答案2
使用“find”和“-print0”选项,并将输出通过管道传输到“xargs”和“-0”选项。
尽管我知道(并使用)这种技术,但我看到用户 @Jens 回答了类似的问题,您可以在其中找到更多详细信息:
https://stackoverflow.com/questions/16758525/use-xargs-with-filenames-containing-whitespaces
答案3
我有两个粗略的建议可能会有所帮助。但两者都感觉不太令人满意,所以也许会出现更好的东西。
首先,使用 sed 为所有内容添加引号,因此如果文件名中包含引号,您只会遇到麻烦
ls -t | head -500 | sed -e 's/\(.*\)/"\1"/' | xargs file | grep -v 'image'
另一种是使用 ls 查找最近的 501 个,然后使用 find 获取较新的内容,例如
find -newer $(ls -t | head -501 | tail -1) -type f -exec file {} \; | grep -v image
答案4
你可以尝试
printf "%s\0" $(ls -t | head -500) | xargs -0 file | grep -v image
这会强制 xargs 以空分隔文件名参数。