我希望将目录中的所有文件(每个文件都有一列)合并到具有多列的单个文件中。但是,我需要按上次修改时间顺序粘贴文件,即在新文件中,第一列将来自最旧的文件,最后一列来自最新文件。
我无法更改原始文件的名称以反映这个时间顺序。我已经使用了命令在这个问题中提出并回答但它并不能完全满足我的需要,因为“*”对于文件时间排序并不智能。
paste * | column -s $'\t' -t > output.txt
答案1
要按上次修改时间对文件名进行排序:
stat -c '%Y %n' * | sort -n | cut -d " " -f 2-
这不处理包含换行符的文件名。
所以:
# read the sorted filenames into an array
mapfile -t files < <(stat -c '%Y %n' * | sort -n | cut -d " " -f 2-)
# then paste the files together
paste "${files[@]}" | ...
答案2
在zsh
shell 中,gobbing 限定符om
按时间戳顺序对文件名通配模式扩展为的条目进行排序mtime
(首先是最近修改的文件;使用inO
代替o
以相反的顺序排序)。通配限定符.
(点)会将通配模式的匹配限制为仅常规文件。
因此,通配模式*(.om)
将扩展到当前目录中常规文件的可见名称,并按mtime
时间戳排序。
从bash
外壳:
zsh -c 'paste ./*(.om)' | column -s $'\t' -t >output.txt
默认情况下,如果模式不匹配任何内容,shell 会将其视为错误zsh
(就像failglob
在 shell 中设置了 shell 选项一样bash
)。
请注意,您可能希望将output.txt
文件写入其他目录,或者更具体地使用通配模式,以免获取输出文件名。以下内容将明确避免output.txt
使用修改后的通配模式的名称:
zsh -o extended_glob -c 'paste ./(^output.txt)(.om)' | columns -s $'\t' -t >output.txt
答案3
您可以对传递给第一个的文件列表进行排序paste
:
paste $(ls -t) | column -s $'\t' -t
ls -t
将返回“按修改时间,最新的在前”排序的文件
paste
只需按照命令行上指定的顺序解析文件即可。