Bash 按日期顺序列出文件,文件名中带有空格

Bash 按日期顺序列出文件,文件名中带有空格,bash,shell,filenames,spaces,ls,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 dir

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

$ 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文档仍在文件名的空格处拆分文件,将引号视为文件名的一部分:

$ 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处理,并创建一个中间文件,其中文件列表和日期以可排序的顺序作为每行的第一个字段,然后对该中间文件进行排序。然而,这感觉有点麻烦和低效,数百个ls命令而不是一两个。但这可能是唯一的办法


是否有任何方法可以向ls传递要处理的文件列表,其中这些文件可能包含空格-看起来应该很简单,但我很困惑。

我不确定这是否有效,但您是否尝试使用\来转义空格?用sed之类的。例如,sed s/\\/g list-of-files.txt。

我不确定这是否有效,但您是否尝试使用\来转义空格?用sed之类的。例如,sed s/\\/g list-of-files.txt。

这对我很有用:

xargs -d\\n ls -last < list-of-files.txt | head -10
这对我很有用:

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

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

OIFS=$IFS
IFS=$'\n'

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

然而,我不认为这段代码比循环更有效;此外,如果list-of-files.txt中的文件数超过最大参数数,则此操作将不起作用。

可以强制bash使用另一个字段分隔符,而不是一个或多个空白字符:

OIFS=$IFS
IFS=$'\n'

ls -las -t $(cat list-of-files.txt) | head -10
IFS=$OIFS
然而,我不认为这段代码比循环更有效;此外,如果list-of-files.txt中的文件数超过最大参数数,则此操作将不起作用。

请尝试以下操作:

xargs -a list-of-files.txt ls -last | head -n 10
试试这个:

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

空间似乎仍然被吸入:ls:hello\:没有这样的文件或目录\nls:world:没有这样的文件或目录。嗯,我想这值得一试。马可的解决方案似乎是可行的,我投赞成票空间似乎仍然被吸入:ls:hello\:没有这样的文件或目录\nls:world:没有这样的文件或目录。嗯,我想这值得一试。马可的解决方案似乎是可行的,我投赞成票因此,xargs不会多次运行ls—它只运行一次,但处理包含参数的空间的传递比here文档更好。在我的xargs GNU xargs版本4.1.20上,我似乎没有-d选项,但我将继续采用这种方法。因此,xargs没有多次运行ls—它只运行一次,但在传递包含参数的空间时,它比here文档处理得更好。我的xargs GNU xargs版本4.1.20上似乎没有-d选项,但我会继续使用这种方法。天哪,我从来不知道。这很管用:-对我现有的代码没有任何更改-我只是在执行列表的脚本中设置了IFS。@Jason:那么您可能应该将其标记为已接受的答案。我自己给它一个+1。啊-点击勾号;-我一直在考虑如何接受一个答案,但就是看不见树木,我的天啊,我从来不知道这一点。这很管用:-对我现有的代码没有任何更改-我只是在执行列表的脚本中设置了IFS。@Jason:那么您可能应该将其标记为已接受的答案。我自己给它一个+1。啊-点击勾号;-我一直在考虑如何接受答案,但就是看不见树木,我的xargs版本没有a-a选项。我曾尝试将源文件管道化到xargs中,但这给了我同样的问题-文件名在空格处拆分。我的xargs版本上没有-a选项。我曾尝试将源文件管道化到xargs中,但这给了我同样的问题-文件名在空格处拆分。谢谢大家-我这里有一些有用的答案,我使用的是Marco的版本。我相信xargs方法可以运行一些调整,我将从长远来看这一点。非常感谢大家的帮助。谢谢大家-我这里有一些有用的答案,我正在使用Marco的版本。我相信xargs方法可以运行一些调整,我将从长远来看这一点。非常感谢大家的帮助。