Answers:
使用for
循环:
for d in $(find /path/to/dir -maxdepth 1 -type d)
do
#Do something, the directory is accessible with $d:
echo $d
done >output_file
它仅搜索目录的子目录/path/to/dir
。请注意,如果目录名称包含空格或特殊字符,则上面的简单示例将失败。一种更安全的方法是:
find /tmp -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir; do echo "$dir"; done
或简单地说bash
:
for d in /path/to/dir/*; do
if [ -d "$d" ]; then
echo "$d"
fi
done
(请注意,与此相反find
,它还考虑了目录的符号链接,但排除了隐藏的链接)
find
类似输出相关的限制和风险。
date +"%m%d20%Y"
| xargs echo echo $ d
date +"%m%d20%Y"
| xargs echo echo $ d预期结果是ls -ltr来自所有子目录。以上循环无法正常工作
我是一个bash
新手,但是是UN * X的资深人士。尽管毫无疑问,这可以在Bash shell脚本中完成,但是在过去,我们曾经find [-maxdepth <levels>] <start-dir> -exec <command> ;
实现此目的。您可以做一个,man find
然后玩耍,直到有人告诉您如何做bash
!
find
命令的开销。
$(find...)
是不好的做法。
看起来您想要每个子目录下的文件名;在ls -l | awk
没有足够强大的,因为如果这些东西包含文件名的空白和/或换行符?find
即使对于find
s而言,以下代码也可以正常工作-maxdepth
:
find . ! -name . -type d -prune -exec sh -c '
cd "$1" && \
find "." ! -name . -prune -type f
' {} {} \;
也可以使用ls,grep和tr
for dir in $(ls -1FA | grep / | tr -d /); do echo $dir/something; done
ls -1FA | grep / | tr -d / | while IFS= read -r TD; do echo $TD/something; done
如果您的ls缺少上述选项,则du / sed也可以用作选择器
du --max-depth=1 | sed -e 's/^.*\.\///' | grep -v '\.$'
注意这些示例返回隐藏目录并排除父目录和当前目录可能很重要