Answers:
您可以在末尾指定一个斜杠以仅匹配目录:
for d in */ ; do
echo "$d"
done
[[ -L $d ]]
$ d是否为符号链接。
set -P
仅影响更改目录的命令。sprunge.us/TNac
请注意,如果当前目录中没有目录可用,那么choroba的解决方案虽然很优雅,但会引起意外的行为。在这种状态下,for
bash不会跳过循环,而是只要d
在等于的位置运行一次循环*/
:
#!/usr/bin/env bash
for d in */; do
# Will print */ if no directories are available
echo $d
done
我建议使用以下方法来防止这种情况:
#!/usr/bin/env bash
for f in *; do
if [ -d ${f} ]; then
# Will not run if no directories are available
echo $f
fi
done
此代码将循环遍历当前目录中的所有文件,检查是否f
为目录,然后f
在条件返回true时回显。如果f
等于*/
,echo $f
则不会执行。
shopt -s nullglob
。
如果您需要选择的特定文件比仅目录要多find
,请将其传递给while read
:
shopt -s dotglob
find * -prune -type d | while IFS= read -r d; do
echo "$d"
done
使用shopt -u dotglob
排除隐藏的目录(或setopt dotglob
/ unsetopt dotglob
中的zsh)。
IFS=
为了避免分割包含其中一个的文件名$IFS
,例如:'a b'
有关更多选项,请参见下面的AsymLabs答案find
编辑:
如果需要从while循环中创建退出值,则可以通过以下技巧来规避多余的子shell:
while IFS= read -r d; do
if [ "$d" == "something" ]; then exit 1; fi
done < <(find * -prune -type d)
您可以为此使用纯bash,但最好使用find:
find . -maxdepth 1 -type d -exec echo {} \;
(另外会找到隐藏目录)
shopt -s dotglob
用于bash
包含隐藏目录。您的还将包括.
。另请注意,这-maxdepth
不是标准选项(-prune
is)。
dotglob
选项很有趣,但dotglob
仅适用于*
。find .
将始终包含隐藏目录(以及当前目录)
这样做是为了在当前工作目录中查找可见目录和隐藏目录,但不包括根目录:
只是遍历目录:
find -path './*' -prune -type d
在结果中包含符号链接:
find -L -path './*' -prune -type d
对每个目录执行某些操作(符号链接除外):
find -path './*' -prune -type d -print0 | xargs -0 <cmds>
排除隐藏目录:
find -path './[^.]*' -prune -type d
在返回的值上执行多个命令(一个非常人为的示例):
find -path './[^.]*' -prune -type d -print0 | xargs -0 -I '{}' sh -c \
"printf 'first: %-40s' '{}'; printf 'second: %s\n' '{}'"
代替'sh -c'也可以使用'bash -c'等。
... -print0 | xargs -0 ...
如果您不知道确切的名称是更好的用法。
find * | while read file; do ...
您可以使用以下命令循环浏览所有目录,包括一行隐藏目录(以点开头)和多个命令:
for file in */ .*/ ; do echo "$file is a directory"; done
如果要排除符号链接:
for file in *; do
if [[ -d "$file" && ! -L "$file" ]]; then
echo "$file is a directory";
fi;
done
注意:使用列表*/ .*/
可以在bash中使用,但也可以显示文件夹.
,..
而在zsh中则不会显示这些文件夹,但是如果文件夹中没有隐藏文件,则会抛出错误
一个更干净的版本将包含隐藏目录并排除../,它将带有dotglob选项:
shopt -s dotglob
for file in */ ; do echo "$file is a directory"; done
(或setopt dotglob
在zsh中)
您可以使用取消设置dotglob
shopt -u dotglob
这将包括列表中每个目录中的完整路径:
for i in $(find $PWD -maxdepth 1 -type d); do echo $i; done
ls -l | grep ^d
要么:
ll | grep ^d
您可以将其设置为别名
ls
,这与列出目录的基于答案的回答略有不同。
ls
:mywiki.wooledge.org/ParsingLs