按上次修改顺序按列粘贴目录中的所有文件

按上次修改顺序按列粘贴目录中的所有文件

我希望将目录中的所有文件(每个文件都有一列)合并到具有多列的单个文件中。但是,我需要按上次修改时间顺序粘贴文件,即在新文件中,第一列将来自最旧的文件,最后一列来自最新文件。

我无法更改原始文件的名称以反映这个时间顺序。我已经使用了命令在这个问题中提出并回答但它并不能完全满足我的需要,因为“*”对于文件时间排序并不智能。

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

zshshell 中,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只需按照命令行上指定的顺序解析文件即可。

相关内容