macos - 如何在 Unix 中处理名称中包含空格的文件列表?

标签 macos unix list shell file

我正在尝试列出目录中的文件并在 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/

相关文章:

ios - mac 应用程序命令行工具上的应用程序传输策略

macos - swift 2.0 : Cannot invoke 'setValue' with an argument list of

python - 在客户端计算机上安装和使用 python

linux - WebDav 检测文件夹的写权限

list - 如何在 Erlang 中使用闭包?

macos - 通过brew安装后如何在Mac OS上使用Vim 7.4?

c++ - 在 Unix 终端中打开程序时,有没有办法让程序名称和它的输入在同一行?

java - 如何最有效地将列表内容复制到另一个列表

python - 如何在排除一种可能性的情况下随机选择列表中的项目?

macos - zsh 中包含破折号的通配文件名解析错误