【发布时间】:2018-04-25 15:04:03
【问题描述】:
我正在尝试打印给定起始目录中的所有目录/子目录。
for i in $(ls -A -R -p); do
if [ -d "$i" ]; then
printf "%s/%s \n" "$PWD" "$i"
fi
done;
此脚本返回在 .目录和该目录中的所有文件,但由于某种原因,子目录的测试失败。所有目录都以 $i 结尾,并且输出看起来完全相同。
假设我有以下结构:
foo/bar/test
echo $i 打印
foo/
bar/
test/
虽然文件夹的内容是这样列出的:
./foo:
file1
file2
./bar:
file1
file2
但是测试语句只是打印:
PWD/TO/THIS/DIRECTORY/foo
由于某种原因,它对第一级目录返回 true,但对所有子目录返回 false。
(ls 可能不是这样做的好方法,我会很高兴找到解决我所有问题的 find 语句,但首先我想知道为什么这个脚本不能像你想象的那样工作。 )
【问题讨论】:
-
顺便说一句,
for i in $(ls ...)本质上是错误的。请参阅ParsingLs、BashPitfalls #1 和 DontReadLinesWithFor。 -
每个目录名后面都有冒号,这样就可以解释为什么
-d是假的了。 -
bash -x yourscript记录每个命令运行(因此,记录[ -d ./foo: ])本身就会使这一点更加明显。 -
另外,使用
printf的正确方法是将数据和格式字符串分开。即printf '%s/%s\n' "$PWD" "$i"。这在 bash 的 printf 中并不像在 C 中那么重要(恶意格式字符串会导致实际的安全漏洞),但是在存在异常或令人惊讶的文件名时仍然可能发生错误。 -
@PeterFlash,您是否使用
sh -x yourscript或bash -x yourscript运行脚本来记录它?完成后,您将知道失败的确切[命令。
标签: shell unix testing directory posix