`xargs` 文件名中有空格

iso*_*mes 7 shell xargs filenames quoting

我试图只列出非图像文件,只在最近的 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 Plutonianfile Nights等等。


我如何帮助xargs查看空间,或者以其他方式完成我想要完成的工作?

shi*_*ams 6

使用xargs,可以通过以下方式完成:

find . -type f -print0 | xargs -0 file | grep -v 'image' 
Run Code Online (Sandbox Code Playgroud)

但是xargs昨天就是这样。酷孩子们parallel今天使用。使用并行,它将是:

find . -type f | parallel file | grep -v 'image'
Run Code Online (Sandbox Code Playgroud)

看。不使用 -print0 和 -0。parallel本身真的很聪明。

更新

要仅列出最近的 500 个文件,您的命令将是:

ls -1t | head -500 | parallel file {} | grep -v image
Run Code Online (Sandbox Code Playgroud)

重要的

如果您的并行是旧的并且以上语法不起作用,请按照此处的说明安装新版本的并行:http : //www.gnu.org/software/parallel/parallel_tutorial.html


Eri*_*ouf 1

我有两个粗略的建议可能会有所帮助。但两者都感觉不太令人满意,所以也许会出现更好的东西。

首先,使用 sed 为所有内容添加引号,因此如果文件名中包含引号,您只会遇到麻烦

ls -t | head -500 | sed -e 's/\(.*\)/"\1"/' | xargs file | grep -v 'image'
Run Code Online (Sandbox Code Playgroud)

另一种是使用 ls 查找最近的 501 个,然后使用 find 获取较新的内容,例如

find -newer $(ls -t | head -501 | tail -1) -type f -exec file {} \; | grep -v image
Run Code Online (Sandbox Code Playgroud)

  • 只要我们要解析 ls 的输出,我相信通过用空值替换换行符(“tr \\n \\0”)并使用“xargs -0”,您的第一个片段将会得到改进。 (2认同)