我正在尝试列出目录中的文件并在 Mac OS X 提示符下对它们执行某些操作。
它应该是这样的: for f in $(ls -1); echo $f;完毕
如果我的文件名中没有空格(fileA.txt、fileB.txt),则回显可以正常工作。
如果文件的名称中包含空格(“file A.txt”、“file B.txt”),我会得到 4 个字符串(file、A.txt、file、B.txt)。
我试过引用列表命令,但它只改变了问题。
如果我这样做: for f in $(ls -1); echo $f;完毕
我得到:文件 A.txt\n文件 B.txt
(它显示正确,但它是一个字符串,我需要将 2 行分开。
最佳答案
尽可能远离 ls 。使用 findutils 包中的 find 。
find /target/path -type f -print0 | xargs -0 your_command_here
-print0
将导致 find 输出由 NUL 字符(ASCII 零)分隔的名称。 -0
xargs 的参数告诉它也期望由 NUL 字符分隔的参数,所以一切都会正常工作。
替换 /target/path
与您的文件所在的路径。-type f
只会定位文件。使用-type d
对于目录,或完全省略以获得两者。
替换 your_command_here
使用您将用于处理文件名的命令。 (注意:如果您从 shell 中使用 echo for your_command_here 运行它,您将在一行中得到所有内容 - 不要被那个 shell 工件弄糊涂,xargs 无论如何都会做预期的正确事情。)
编辑:或者(或者如果你没有 xargs),你可以使用效率低得多的
find /target/path -type f -exec your_command_here \{\} \;
\{\} \;
是{} ;
的转义这是当前处理文件的占位符。然后 find 将调用 your_command_here
与 {} ;
替换为文件名,并且因为 your_command_here
将由 find 而不是由 shell 启动,空格无关紧要。
第二个版本效率较低,因为 find 将为找到的每个文件启动一个新进程。如果 xargs 认为这样做是安全的,那么它足够聪明,可以将命令传递给新启动的进程。如果可以选择,请首选 xargs 版本。
关于macos - 如何在 Unix 中处理名称中包含空格的文件列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/396181/