Bash 如何按排序顺序连接文件?

Bash 如何按排序顺序连接文件?,bash,Bash,我有一个文件目录,我想合并它们。唯一的问题是,我想通过调用“ls-l”将它们以完全相同的顺序合并 output.txt必须位于其他目录中,否则cat将失败 运行示例: [myria@machine dir]$ echo Kitty > Kitty.txt [myria@machine dir]$ echo Meow > Meow.txt [myria@machine dir]$ echo Cat > Cat.txt [myria@machine dir]$ echo Purr

我有一个文件目录,我想合并它们。唯一的问题是,我想通过调用“
ls-l
”将它们以完全相同的顺序合并

output.txt必须位于其他目录中,否则
cat
将失败

运行示例:

[myria@machine dir]$ echo Kitty > Kitty.txt
[myria@machine dir]$ echo Meow > Meow.txt
[myria@machine dir]$ echo Cat > Cat.txt
[myria@machine dir]$ echo Purr > Purr.txt
[myria@machine dir]$ cat `ls` > ../output.txt
[myria@machine dir]$ cat ../output.txt
Cat
Kitty
Meow
Purr
如果文件数量很大,则此操作可能会失败。如评论中所述,对于深奥的案例,有更好的解决方案

output.txt必须位于其他目录中,否则
cat
将失败

运行示例:

[myria@machine dir]$ echo Kitty > Kitty.txt
[myria@machine dir]$ echo Meow > Meow.txt
[myria@machine dir]$ echo Cat > Cat.txt
[myria@machine dir]$ echo Purr > Purr.txt
[myria@machine dir]$ cat `ls` > ../output.txt
[myria@machine dir]$ cat ../output.txt
Cat
Kitty
Meow
Purr

如果文件数量很大,则此操作可能会失败。对于深奥的案例,有更好的解决方案,如注释中所述。

shell已经对全局进行了开箱即用的排序。因此,对于以下任一情况:

# works only if the number of names is short enough to fit in one invocation
cat * >../output.txt
…或者,它的表亲支持的名称超过了单个命令行所能容纳的数量

# works for any arbitrary number of names
printf '%s\0' * | xargs -0 cat >../output.txt

…输出已根据
LC\u COLLATE
中定义的排序顺序进行排序(该变量
ls
在其可能执行的任何排序中也应遵守)。

shell已对全局进行了开箱即用的排序。因此,对于以下任一情况:

# works only if the number of names is short enough to fit in one invocation
cat * >../output.txt
…或者,它的表亲支持的名称超过了单个命令行所能容纳的数量

# works for any arbitrary number of names
printf '%s\0' * | xargs -0 cat >../output.txt

…输出已根据
LC\u COLLATE
中定义的排序顺序进行排序。

这不适用于所有可能的文件名。请参见即使使用编辑功能--no,
ls | xargs cat
也不能处理所有可能的名称--请查看带有空格的名称,以获得一个非常简单的示例,说明它在何处被破坏……对于一个更复杂的示例,请尝试创建如下文件:
echo“content”>$'foo\nbar'
。这不会处理所有可能的文件名。即使使用编辑也可以看到--no,
ls | xargs cat
不能处理所有可能的名称--查看带有空格的名称,以获得一个非常简单的示例,说明它在哪里被破坏了……对于一个更复杂的示例,请尝试创建这样的文件:
echo“content”>$'foo\nbar'
。全局扩展都是按
LC\u-COLLATE
配置排序的已经你认为ls会增加什么?顺便说一句,对于按时间排序这样的情况,解决方案会更有趣。请参阅BashFAQ#3:全局扩展已全部排序(根据
LC\u-COLLATE
configuration)。你认为ls会增加什么?顺便说一句,对于按时间排序这样的情况,解决方案会更有趣。参见BashFAQ#3:让我想要一个
ls-0
功能。@Myria,的确——POSIX支持
-0
/
-z
(全面——因此
排序
通信
,以及所有其他标准工具)将是一件美好的事情;我希望有一天这些建议能真正成为标准。就这点而言,最好保证
read-0
,而不是需要笨拙的
IFS=read-r-d'
咒语。您的第二个示例仍然需要在一次printf调用中容纳所有文件名。它不会和第一个一样有风险吗?@glennjackman,不会,因为
printf
是内置的。没有
execv
,因此没有
ARG_MAX
限制..这让我想要一个
ls-0
功能。@Myria,的确--对
-0
/
-z
的POSIX支持(全面--因此
排序
通信
,以及所有其他标准工具)将是一件美妙的事情;我希望有一天这些建议能真正成为标准。就这点而言,最好保证
read-0
,而不是需要笨拙的
IFS=read-r-d'
咒语。您的第二个示例仍然需要在一次printf调用中容纳所有文件名。它不会和第一个一样有风险吗?@glennjackman,不会,因为
printf
是内置的。没有
execv
,因此没有
ARG\u MAX
限制。。