rub*_*o77 389 bash directory files
我有一个文件夹,里面有一些目录和一些文件(有些是隐藏的,以点开头)。
for d in *; do
echo $d
done
Run Code Online (Sandbox Code Playgroud)
将遍历所有文件和目录,但我只想遍历目录。我怎么做?
cho*_*oba 518
您可以在末尾指定斜杠以仅匹配目录:
for d in */ ; do
echo "$d"
done
Run Code Online (Sandbox Code Playgroud)
gol*_*cks 109
你可以测试-d:
for f in *; do
if [ -d "$f" ]; then
# $f is a directory
fi
done
Run Code Online (Sandbox Code Playgroud)
这是文件测试操作符之一。
小智 58
请注意,choroba 的解决方案虽然优雅,但如果当前目录中没有可用目录,则可能会引发意外行为。在这种状态下,forbash 将只运行一次循环,而不是跳过循环,其中d等于*/:
#!/usr/bin/env bash
for d in */; do
# Will print */ if no directories are available
echo "$d"
done
Run Code Online (Sandbox Code Playgroud)
我建议使用以下方法来防止这种情况:
#!/usr/bin/env bash
for f in *; do
if [ -d "$f" ]; then
# Will not run if no directories are available
echo "$f"
fi
done
Run Code Online (Sandbox Code Playgroud)
此代码将遍历当前目录中的所有文件,检查是否f为目录,f如果条件返回 true ,则回显。如果f等于*/,echo "$f"则不会执行。
rub*_*o77 29
如果您需要选择比仅使用目录更具体的文件find并将其传递给while read:
shopt -s dotglob
find * -prune -type d | while IFS= read -r d; do
echo "$d"
done
Run Code Online (Sandbox Code Playgroud)
使用shopt -u dotglob排除隐藏的目录(或setopt dotglob/unsetopt dotglob中的zsh)。
IFS=避免拆分包含其中之一的文件名$IFS,例如:'a b'
有关更多选项,请参阅下面的AsymLabs 答案find
编辑:
如果您需要在 while 循环中创建退出值,您可以通过以下技巧绕过额外的子外壳:
while IFS= read -r d; do
if [ "$d" == "something" ]; then exit 1; fi
done < <(find * -prune -type d)
Run Code Online (Sandbox Code Playgroud)
rus*_*ush 15
您可以为此使用纯 bash,但最好使用 find:
find . -maxdepth 1 -type d -exec echo {} \;
Run Code Online (Sandbox Code Playgroud)
(另外查找将包括隐藏目录)
这样做是为了在当前工作目录中查找可见和隐藏目录,不包括根目录:
只循环遍历目录:
find -path './*' -prune -type d
Run Code Online (Sandbox Code Playgroud)
在结果中包含符号链接:
find -L -path './*' -prune -type d
Run Code Online (Sandbox Code Playgroud)
对每个目录做一些事情(不包括符号链接):
find -path './*' -prune -type d -print0 | xargs -0 <cmds>
Run Code Online (Sandbox Code Playgroud)
排除隐藏目录:
find -path './[^.]*' -prune -type d
Run Code Online (Sandbox Code Playgroud)
对返回值执行多个命令(一个非常人为的例子):
find -path './[^.]*' -prune -type d -print0 | xargs -0 -I '{}' sh -c \
"printf 'first: %-40s' '{}'; printf 'second: %s\n' '{}'"
Run Code Online (Sandbox Code Playgroud)
代替 'sh -c' 也可以使用 'bash -c' 等。