【问题标题】:Listing files in date order with spaces in filenames按日期顺序列出文件,文件名中带有空格
【发布时间】:2011-06-02 19:09:53
【问题描述】:

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

$ 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

我已尝试引用原始文件列表文件中的文件,但此处的文档仍将文件拆分为文件名中的空格,将引号视为文件名的一部分:

$ 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

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

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

【问题讨论】:

  • 谢谢大家 - 我这里有一些有效的答案,并且正在使用 Marco 的版本。我确信 xargs 方法可以通过一些调整来运行,我会从长远来看。非常感谢所有帮助。

标签: bash shell filenames spaces ls


【解决方案1】:

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

OIFS=$IFS
IFS=$'\n'

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

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

【讨论】:

  • 天哪 - 我从来不知道。这是一种享受 :-) 对我现有的代码没有任何更改 - 我只是在执行列表的脚本中设置 IFS。
  • @Jason:那么您可能应该将此标记为已接受的答案。我自己给它+1。
  • 啊 - 单击勾号 ;-) 一直在研究如何接受答案,但只是看不到树木的树林。
【解决方案2】:

试试这个:

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

【讨论】:

  • 我的 xargs 版本没有“-a”选项。我尝试将源文件通过管道传输到 xargs,但这给了我同样的问题 - 文件名在空格处拆分。
【解决方案3】:

我不确定这是否可行,但您是否尝试使用 \ 转义空格?使用 sed 什么的。以sed "s/ /\\\\ /g" list-of-files.txt 为例。

【讨论】:

  • 空格似乎还是被吸进去了:ls: hello\: 没有那个文件或目录\nls: world: 没有那个文件或目录
  • 嗯。好吧,我想这值得一试。马可的解决方案似乎是要走的路,我赞成。 :)
【解决方案4】:

这对我有用:

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

【讨论】:

  • 所以 xargs 并没有运行 ls 多次 - 它只运行一次,但处理传递包含空格的参数比 here-document 更好。我的 xargs(GNU xargs 版本 4.1.20)上似乎没有“-d”选项,但我会遵循这种方法。
猜你喜欢
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 2012-02-16
  • 2014-06-19
  • 1970-01-01
  • 2014-05-14
相关资源
最近更新 更多