文件名中带有空格的“xargs”

文件名中带有空格的“xargs”

我试图仅列出非图像文件,仅搜索最近的 500 个文件。所以我跑

ls -t | head -500 | file | grep -v 'image'

这是不对的:它显示一条帮助消息。将其更改为

ls -t | head -500 | xargs file | grep -v 'image'

现在,我有时会得到我想要的输出,但如果文件名中包含空格(例如)Plutonian\ Nights\ -\ Sun\ Ra.mp3xargs则将运行file Plutonianfile 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 以空分隔文件名参数。

相关内容