【问题标题】:bash for loop on directories with symbols在带有符号的目录上执行 bash for 循环
【发布时间】:2013-03-15 10:48:37
【问题描述】:

我正在尝试在包含空格、逗号和括号的文件夹上创建一个 for 循环。例如: Italy - Rimini (Feb 09, 2013)

首先,它会扫描父文件夹 /albums 中的子文件夹,如上例所示。然后它对那些子文件夹中的文件执行 curl 操作。如果子文件夹不包含空格、逗号或其他符号,则可以正常工作。

for dir in `ls /albums`;
do
    for file in /albums/$dir/*
    do
            curl http://upload.com/up.php -F uploadfile[]=@"$file" > out.txt
            php process.php 
    done
    php match.php
done

但是如果有这样的符号,似乎 curl 位被卡住了 - 它找不到 $file(可能是因为 $dir 不正确)。

我可以替换子目录中的所有符号或删除它们或将文件夹重命名为 001、002,它可以完美运行。但在诉诸于此之前,我想知道是否可以使用 bash 技巧来解决它,同时保持子文件夹名称不变?

【问题讨论】:

  • 在 StackOverflow 上阅读 find -print0 | xargs ... 。 100 个例子。祝你好运。
  • 迭代ls 的输出并不好,因为文件名可能包含\n 等时髦字符。

标签: bash shell for-loop


【解决方案1】:

熟悉你的shell的分词的概念。然后意识到使用ls 获取带有空格的文件列表是自找麻烦。相反,使用 shell 通配符,然后引用扩展:

cd /albums
for dir in *; do
   for file in /albums/"$dir"/*; do
     echo  x"$dir"x"$file"x
   done
   php match.php
done

【讨论】:

【解决方案2】:

对于文件名中的空格问题,您必须将 IFS 更改为

IFS='
'

告诉shell,只有换行符是文件分隔符。默认情况下,IFS 设置为制表符、空格和换行符。

所以只要把它放在循环开始之前,它将适用于包含空格的文件名。

当然还要在变量名周围加上引号。

【讨论】:

    猜你喜欢
    • 2017-04-11
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多