Bash - 以递归方式遍历包含空格和点的所有子目录

时间:2016-10-05 16:22:13

标签: bash recursion

我想使用像find之类的东西来递归查找所有子目录,我需要在for循环中这样做 - 任务太复杂而且对&来说太长了。

上面的部分很简单,但我还需要在目录名称中包含空格(前缀) - 到目前为止,每个解决方案都失败了我在这个SE上找到了。名称总是被拆分,或者find只吐出一个字符串(for循环只发生一次)。

1 个答案:

答案 0 :(得分:2)

对于纯Bash for - 循环,请使用:

shopt -s nullglob globstar dotglob

for subdir in **/; do
    do_stuff_with "$subdir" # quote the expansion "$subdir"
done
  • 要使用递归glob,我们将**/与shell选项globstar一起使用。
  • dotglob选项要求shell也对“隐藏”文件(具有前导句点的文件)进行全局处理。
  • nullglob是在没有匹配时将glob扩展为空。 (循环使用globs时使用它总是一个好主意;否则当使用glob作为命令的参数时,failglob是一个不错的选择。)

使用GNU find,您也可以按照以下方式执行此操作(不要忘记使用-print0并使用read的分隔符选项-d '' ,还有-r和空IFS):

while IFS= read -r -d '' subdir; do
    do_stuff_with "$subdir" # quote the expansion "$subdir"
done < <(find . \! -name . -type d -print0)

\! -name .谓词是排除父./目录。

对于文件名中的任何有趣符号,这两种方法都是安全的,只要您引用扩展名"$subdir"

但我想你在空格中遇到的主要问题是你没有引用你的变量扩展!

  

不要忘记引用每次扩展 "$subdir"

我是否说过你应该引用每一个变量扩展?