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
限制。。