按日期顺序列出文件,文件名中包含空格

时间:2011-01-03 10:48:38

标签: bash shell filenames spaces ls

我从一个包含随机顺序的数百个文件(完整路径)列表的文件开始。我想列出该列表中十个最新文件的详细信息。这是我天真的尝试:

$ ls -las -t `cat list-of-files.txt` | head -10

这是有效的,只要没有文件中有空格,但如果它们这样做就会失败,因为这些文件在空格处分开并被视为单独的文件。文件“hello world”给了我:

ls: hello: No such file or directory
ls: world: No such file or directory

我试过引用原始文件列表文件中的文件,但是here-document仍然将文件拆分到文件名中的空格处,将引号视为文件名的一部分:

$ ls -las -t `awk '{print "\"" $0 "\""}' list-of-files.txt` | head -10

ls: "hello: No such file or directory
ls: world": No such file or directory

我能想到这样做的唯一方法是单独使用每个文件(或许使用xargs)并创建一个带有文件列表的中间文件,并以可排序的顺序创建日期作为每行中的第一个字段,然后排序那中间文件。然而,这感觉有点麻烦和低效(数百个命令而不是一个或两个)。但这可能是唯一的方法吗?

有没有办法传递“ls”要处理的文件列表,这些文件可能包含空格 - 看起来它应该很简单,但我很难过。

4 个答案:

答案 0 :(得分:6)

您可以强制bash使用其他字段分隔符,而不是“一个或多个空白字符”:

OIFS=$IFS
IFS=$'\n'

ls -las -t $(cat list-of-files.txt) | head -10
IFS=$OIFS

但是,我不认为这段代码比循环更有效;此外,如果list-of-files.txt中的文件数超过最大参数数,则无效。

答案 1 :(得分:2)

试试这个:

xargs -a list-of-files.txt ls -last | head -n 10

答案 2 :(得分:1)

我不确定这是否有效,但您是否尝试使用\转义空格?使用sed或其他东西。例如sed "s/ /\\\\ /g" list-of-files.txt

答案 3 :(得分:1)

这对我有用:

xargs -d\\n ls -last < list-of-files.txt | head -10