我有一个包含大量文件的目录。
./I_am_a_dir_with_many_subdirs/
在脚本中,我想找到其中的所有子目录,对它们进行排序并输出到 bash 数组。因此,我这样做:
SubdirsArray=(`find ./I_am_a_dir_with_many_subdirs/ -maxdepth 2 -mindepth 2 -type d | sort`)
执行脚本时,我收到以下错误消息:
sort: write failed: standard output: Broken pipe
sort: write error
正如本文所解释的邮政:可能在完成写入sort
之前执行并关闭管道。因此,由 发起的 write() 命令会收到错误 EPIPE“管道损坏”,操作系统会发送SIGPIPE。在 SIGPIPE 到达 之前,它会打印错误消息,然后收到 SIGPIPE 并死亡。find
find
find
find
问题:
那么,我的目录包含什么?找到但未排序的
SubdirsArray
子目录?find
sort
如果是这样,那么解决管道损坏问题的方法是什么?让 find 将其结果写入临时文件,然后让 sort 读取它?
我不明白,为什么如果它发生在非交互式 shell 中,那么“也没什么可担心的”:为什么?我的
SubdirsArray
脚本中包含一些未排序的内容,而我假设它的元素是已排序的?!我收到两条错误消息:
sort: write failed: standard output: Broken pipe sort: write error
在此线提示说sort
临时目录中没有足够的空间来对所有输入进行排序。但是,这难道不意味着 sort 从 find 中得到了一些东西吗?!?我很困惑……无论如何,我尝试使用
SubdirsArray=(`find ./I_am_a_dir_with_many_subdirs/ -maxdepth 2 -mindepth 2 -type d | sort -T /home/temp_dir`)
但没有帮助。
附言
我不确定它是否重要,但我find|sort
在多处理器脚本中使用它:多个处理器在子 shell 中同时执行相同的命令。
答案1
sort: write failed: standard output: Broken pipe
问题不在于find
和之间sort
。sort
存在 的问题输出, 意思是shell 不愿意读取变量中的长列表。
您必须使用while read
... 处理输入,如果多次需要,则将其存储在临时文件中。 还有一个额外的优势,即它只在换行符处进行拆分,因此它可以正确处理带空格的文件名,而反引号方法则不能。
不幸的是,你没有说你想如何使用结果,我无法告诉你如何准确地重写它。
请注意,数组不是 POSIX shell 规范的一部分,有些 shell 的速度明显比 bash 快,但没有数组。这就是为什么包括我在内的许多人经常避免在脚本中使用它们。