gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:14:14 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com