查找并 ls 输出

查找并 ls 输出

我在尝试将所有 .mp4 影片输出到文本文件中时遇到问题,它可以工作,但发生了一些奇怪的事情,我不确定为什么。

这是命令。

find "/volume1 HD FILMS" -iname "*.mp4" -type f -exec ls {} \; > "/volume1/3. HD FILMS/HD_FILMS_`date +%d.%m.%Y`.txt"
  1. 为什么它输出路径?当目录中的 ls 只是打印文件时(这就是我想要的)
  2. 为什么输出文件不是按字母顺序排列(再次与目录中的 ls 进行比较 - 它似乎是随机的)

我该如何解决这些问题?

答案1

要回答您的确切问题:

为什么它输出路径?当目录中的 ls 只是打印文件时(这就是我想要的)

它输出路径是因为你不是目录内。 ls somedir不同于cd somedir; ls.

为什么输出文件不是按字母顺序排列(再次与目录中的 ls 进行比较 - 它似乎是随机的)

ls将文件按字母顺序排列,然后输出全部。因此它有机会在打印之前对它们进行排序。

当您使用findwith-exec并终止命令 with时\;,您明确告诉find运行一个命令(在本例中ls为一个命令)每一个由 找到的文件find。因此不可能对它们进行排序。

如果您使用过,ls -l您还会注意到列未正确对齐,因为每个打印行实际上是从不同的命令输出的。

相反,您可以考虑使用find ... -lsor find ... -print,或者如果确实有必要使用-exec ls,你可以用-exec ls {} +,它应该处理大部分排序。 (具体来说,它可能会将所有文件一起排序,但如果数量如此之大以至于超出了您的系统的数量ARG_MAX,那么find将被迫使用单独的ls命令,并且这些单独的批次将单独排序。)


笔记:我个人永远不会将这样的文件名列表保存到文本文件中,因为文件名包含换行符。没有万无一失的方法可以将文本文件解析为单独的文件名。时期。 (看为什么不是解析ls

相反,我只需运行find命令当我想做某事时与文件一起,不要提前运行它,然后尝试对早期的输出执行某些操作。

如果我想生成所有mp4文件的人类可读列表,我要强调的是,不能通过删除路径组件来依赖这些文件名:

find "/volume1 HD FILMS" -iname "*.mp4" -type f -print | sed 's:.*/::;s/\.[mM][pP]4$//' > "/volume1/3. HD FILMS/HD_FILMS_$(date +%d.%m.%Y).txt"

相关内容