【问题标题】:Loop over directories with whitespace in Bash在 Bash 中循环使用空格的目录
【发布时间】:2011-02-04 07:16:33
【问题描述】:

在 bash 脚本中,我想遍历当前工作目录中的所有目录并对它们进行处理。它们可能包含特殊符号,尤其是空格。我怎样才能做到这一点?我有:

for dir in $( ls -l ./)
do
    if [ -d ./"$dir" ]

但这会跳过名称中带有空格的我的目录。任何帮助表示赞赏。

【问题讨论】:

    标签: bash


    【解决方案1】:

    试试这个:

    for dir in */
    

    【讨论】:

    • 这样做了,但是为什么呢? */ 是所有目录的通配符?
    • 哇,这确实有效,即使在带有空格的目录上也是如此。那么,bash 在扩展通配符时必须隐式引用这些值吗?我喜欢它。
    • @JakeVA:是的,完全正确。请注意,除非您设置shopt -s dotglob,否则它不会包含隐藏目录。如果当前目录可能没有子目录,你也应该设置shopt -s nullglob(设置它以防万一)。
    • @Air: shopt -s globstar; for dir in **/ 在 Bash 4 中将递归。
    • @Sigur:for dir in /some/dir/*/ 或递归shopt -s globstar; for dir in /some/dir/*/。任何目录规范都可以,神奇的是在 glob 之后添加最后一个斜杠。
    【解决方案2】:

    选择解决方案:

    http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html

    总体思路是更改默认分隔符 (IFS)。

    #!/bin/bash
    SAVEIFS=$IFS
    IFS=$(echo -en "\n\b")
    for f in *
    do
      echo "$f"
    done
    IFS=$SAVEIFS
    

    【讨论】:

    • 我忽略了在我的问题中提到这一点,但我试过了。我认为缺少的部分是迭代 * 或 */ 而不是 ls 的结果
    • 我在这里找到了我的解决方案,使用find . -print0 | while read -d $'\0' file 来设置do 循环和变量file
    【解决方案3】:

    有多种方法。这是非常快的:

    find /your/dir -type d -print0 | xargs -0 echo
    

    这将递归地扫描 /your/dir 以查找目录,并将所有路径传递给命令“echo”(根据您的需要进行交换)。它可能会多次调用 echo,但它会尝试一次传递控制台允许的尽可能多的目录名称。这是非常快的,因为需要启动的进程很少。但它仅适用于可以将任意数量的值作为选项的程序。 -print0 告诉 find 使用零字节分隔文件路径(并且 -0 告诉 xargs 读取由零字节分隔的参数) 如果你没有后者,你可以这样做:

    find /your/dir -type d -print0 | xargs -0 -n 1 echo
    

    find /your/dir -type d -print0 --exec echo '{}' ';'
    

    选项 -n 1 将告诉 xargs 不要同时将多个参数传递给您的程序。 如果你不想 find 递归扫描,你可以指定 depth 选项来禁用递归(虽然不知道语法)。

    虽然这是否适用于您的特定脚本是另一个问题;-)。

    【讨论】:

    • 请注意,xargs 有其他可用的工具,例如 -J 。示例:xargs -0 -J % mv % ~/some_other_folder
    猜你喜欢
    • 2015-07-14
    • 2017-10-16
    • 1970-01-01
    • 2021-07-17
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2019-01-22
    相关资源
    最近更新 更多