我在尝试将所有 .mp4 影片输出到文本文件中时遇到问题,它可以工作,但发生了一些奇怪的事情,我不确定为什么。
这是命令。
find "/volume1 HD FILMS" -iname "*.mp4" -type f -exec ls {} \; > "/volume1/3. HD FILMS/HD_FILMS_`date +%d.%m.%Y`.txt"
- 为什么它输出路径?当目录中的 ls 只是打印文件时(这就是我想要的)
- 为什么输出文件不是按字母顺序排列(再次与目录中的 ls 进行比较 - 它似乎是随机的)
我该如何解决这些问题?
答案1
要回答您的确切问题:
为什么它输出路径?当目录中的 ls 只是打印文件时(这就是我想要的)
它输出路径是因为你不是目录内。 ls somedir
不同于cd somedir; ls
.
为什么输出文件不是按字母顺序排列(再次与目录中的 ls 进行比较 - 它似乎是随机的)
ls
将文件按字母顺序排列,然后输出全部。因此它有机会在打印之前对它们进行排序。
当您使用find
with-exec
并终止命令 with时\;
,您明确告诉find
运行一个命令(在本例中ls
为一个命令)每一个由 找到的文件find
。因此不可能对它们进行排序。
如果您使用过,ls -l
您还会注意到列未正确对齐,因为每个打印行实际上是从不同的命令输出的。
相反,您可以考虑使用find ... -ls
or 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"