我想使用像find
之类的东西来递归查找所有子目录,我需要在for
循环中这样做 - 任务太复杂而且对&
来说太长了。
上面的部分很简单,但我还需要在目录名称中包含空格和点(前缀) - 到目前为止,每个解决方案都失败了我在这个SE上找到了。名称总是被拆分,或者find
只吐出一个字符串(for
循环只发生一次)。
答案 0 :(得分:2)
对于纯Bash for
- 循环,请使用:
shopt -s nullglob globstar dotglob
for subdir in **/; do
do_stuff_with "$subdir" # quote the expansion "$subdir"
done
**/
与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"
。
我是否说过你应该引用每一个变量扩展?