【问题标题】:how to sort the linux find command by the path如何按路径对linux find命令进行排序
【发布时间】:2018-01-13 16:10:24
【问题描述】:

我正在编写一个小的 shell 脚本。我想递归地获取所有文件的路径。为此,我正在使用波纹管代码。

for entry in `find . -type f`; do
       echo $entry 
done

递归获取文件是可以的。但它不按路径排序。

ex :该文件夹有 1,2,3,rename.sh(shell 脚本)文件和一个名为 test 的文件夹。在该测试文件夹内再次有 1,2,3 个文件。当我执行这段代码时,输​​出是这样的

./rename.sh
./1.png
./test/1.png
./test/2.jpg
./test/3.jpg
./2.jpg
./3.jpg

为什么不按路径排序。我如何按路径对其进行排序,以便输出为

./rename.sh
./1.png
./2.jpg
./3.jpg
./test/1.png
./test/2.jpg
./test/3.jpg

【问题讨论】:

  • 顺便说一句——用for 读取find 的输出是错误的;它与BashPitfalls #1 属于同一类。
  • 至于“为什么没有排序?” - 因为排序需要时间,而且当用户没有明确请求时,没有必要花费时间(除非文件系统的索引方式是它可以免费返回目录条目 - 但这是一个问题您使用哪个文件系统格式化您的驱动器,它配置了哪些标志等)。
  • @CharlesDuffy 非常感谢你指出这一点......那么有没有办法可以实现我想要的。

标签: linux bash shell sh


【解决方案1】:

如果您想对内容进行排序,自己动手。对于文件列表,安全地执行此操作意味着对名称进行 NUL 分隔(因此名称中带有换行符的文件不会被读取为两个单独文件的名称,因此在排序过程中会分开),并使用 @ 987654323@(GNU 扩展)。

while IFS= read -r -d '' entry; do
  printf 'Processing: %s\n' "$entry"
done < <(find . -type f -print0 | sort -z)

有关可靠使用find 的指导,请参阅Using Find,有关此处使用的while read 构造的讨论,请参阅BashFAQ #1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2011-11-12
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多