目录上的 Bash For-Loop
Posted
技术标签:
【中文标题】目录上的 Bash For-Loop【英文标题】:Bash For-Loop on Directories 【发布时间】:2011-04-30 00:38:35 【问题描述】:快速背景:
$ ls src
file1 file2 dir1 dir2 dir3
脚本:
#!/bin/bash
for i in src/* ; do
if [ -d "$i" ]; then
echo "$i"
fi
done
输出:
src/dir1
src/dir2
src/dir3
但是,我希望它阅读:
dir1
dir2
dir3
现在我意识到我可以 sed/awk 输出以删除“src/”但是我很想知道是否有更好的方法来解决这个问题。也许使用 find + while-loop 代替。
【问题讨论】:
【参考方案1】:对echo
行执行此操作:
echo $(basename "$i")
【讨论】:
我看到您已将帖子更新为 basename 而不是 dirname ding,ding,ding 正确!!! :D 谢谢,我会接受你的回答 2 天前从 O'Rielly 的书中学到了这个金块。如果我几年前就知道的话,本可以为我节省数小时的 sed 愚蠢行为。 这仅解决打印问题,但 for 循环仍在文件上运行。问题标题只需要目录上的 for 循环。对于寻找那个的用户:unix.stackexchange.com/a/86724/46717【参考方案2】:无需分叉外部进程:
echo "$i##*/"
它使用“删除最长匹配前缀”parameter expansion。
*/
是模式,因此它将删除从字符串开头到最后一个斜杠(包括最后一个斜杠)的所有内容。如果$i
的值中没有斜线,则与"$i"
相同。
这个特殊的参数扩展是specified in POSIX,是原始 Bourne shell 遗留的一部分。它在所有类似 Bourne 的 shell(sh、ash、dash、ksh、bash 、zsh 等)。许多功能丰富的 shell(例如 ksh、bash 和 zsh)还有其他扩展,可以在不涉及外部进程的情况下处理更多。
【讨论】:
【参考方案3】:如果您在脚本开始时执行cd
,则应在脚本退出时将其还原。
#!/bin/bash
cd src
for i in * ; do
if [ -d "$i" ]; then
echo "$i"
fi
done
【讨论】:
它应该……但如果你使用.
或source
命令来调用脚本,它不会。而是使用pushd
和popd
。【参考方案4】:
将basename
用作:
if [ -d "$i" ]; then
basename "$i"
fi
【讨论】:
以上是关于目录上的 Bash For-Loop的主要内容,如果未能解决你的问题,请参考以下文章