生成按 Bash 中的数字文件名排序的文本文件
erge text files ordered by numerical filenames in Bash
有没有办法用一个 bash 命令按文件名的数字顺序连接多个文本文件?
我试过了,但是不知为什么,前三行顺序不对
sort -n *txt > all.txt
ls *txt | sort -n | xargs cat > all.txt
这会获取所有文件名的列表并对其进行排序,然后使用 xargs 从 cat
和排序后的列表构建命令行。
添加这个答案,只是因为 suggests a bad practice. & In future, Hellmar may land in exact same problem I faced once. : Cannot delete an accepted answer.
无论如何,这应该是安全的答案:
printf "%s[=10=]" *txt | sort -zn | xargs -0 cat > all.txt
此处,整个管道的文件名由 NULL 字符分隔。 NULL 字符是唯一不能作为文件名一部分的字符。
此外,如果所有文件名都具有相同的结构(比如 file0001.txt、file0002.txt 等),那么这段代码应该同样有效:
cat file[0-9][0-9][0-9][0-9].txt > all.txt
更新 anishsane 的回答。
printf "%s[=10=]" *txt | sort -k1.thecharlocation -zn | xargs -0 cat > all.txt
thecharlocation
是您要排序的第一个键。如果你的文件名是file01.txt
,thecharlocation
就是5
.
另请参阅 Nate 在此 question 中的另一个类似回答。
有没有办法用一个 bash 命令按文件名的数字顺序连接多个文本文件?
我试过了,但是不知为什么,前三行顺序不对
sort -n *txt > all.txt
ls *txt | sort -n | xargs cat > all.txt
这会获取所有文件名的列表并对其进行排序,然后使用 xargs 从 cat
和排序后的列表构建命令行。
添加这个答案,只是因为
无论如何,这应该是安全的答案:
printf "%s[=10=]" *txt | sort -zn | xargs -0 cat > all.txt
此处,整个管道的文件名由 NULL 字符分隔。 NULL 字符是唯一不能作为文件名一部分的字符。
此外,如果所有文件名都具有相同的结构(比如 file0001.txt、file0002.txt 等),那么这段代码应该同样有效:
cat file[0-9][0-9][0-9][0-9].txt > all.txt
更新 anishsane 的回答。
printf "%s[=10=]" *txt | sort -k1.thecharlocation -zn | xargs -0 cat > all.txt
thecharlocation
是您要排序的第一个键。如果你的文件名是file01.txt
,thecharlocation
就是5
.
另请参阅 Nate 在此 question 中的另一个类似回答。