【发布时间】:2011-02-04 07:16:33
【问题描述】:
在 bash 脚本中,我想遍历当前工作目录中的所有目录并对它们进行处理。它们可能包含特殊符号,尤其是空格。我怎样才能做到这一点?我有:
for dir in $( ls -l ./)
do
if [ -d ./"$dir" ]
但这会跳过名称中带有空格的我的目录。任何帮助表示赞赏。
【问题讨论】:
标签: bash
在 bash 脚本中,我想遍历当前工作目录中的所有目录并对它们进行处理。它们可能包含特殊符号,尤其是空格。我怎样才能做到这一点?我有:
for dir in $( ls -l ./)
do
if [ -d ./"$dir" ]
但这会跳过名称中带有空格的我的目录。任何帮助表示赞赏。
【问题讨论】:
标签: bash
试试这个:
for dir in */
【讨论】:
shopt -s dotglob,否则它不会包含隐藏目录。如果当前目录可能没有子目录,你也应该设置shopt -s nullglob(设置它以防万一)。
shopt -s globstar; for dir in **/ 在 Bash 4 中将递归。
for dir in /some/dir/*/ 或递归shopt -s globstar; for dir in /some/dir/*/。任何目录规范都可以,神奇的是在 glob 之后添加最后一个斜杠。
选择解决方案:
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
【讨论】:
find . -print0 | while read -d $'\0' file 来设置do 循环和变量file。
有多种方法。这是非常快的:
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 选项来禁用递归(虽然不知道语法)。
虽然这是否适用于您的特定脚本是另一个问题;-)。
【讨论】: