Bash For-Loop on Directories

时间:2010-10-25 03:10:02

标签: bash loops shell directory

快速背景:

$ 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代替。

4 个答案:

答案 0 :(得分:19)

请改为echo行:

 echo $(basename "$i")

答案 1 :(得分:13)

无需分配外部流程:

echo "${i##*/}"

它使用“删除最长匹配前缀”parameter expansion*/是模式,因此它将删除从字符串开头到最后一个斜杠的所有内容。如果$i的值没有斜杠,那么它与"$i"相同。

此特定参数扩展为specified in POSIX,是原始Bourne shell遗留的一部分。它在所有类似Bourne的shell中受支持( sh ash dash ksh bash zsh 等)。许多功能丰富的shell(例如 ksh bash zsh )具有其他扩展功能,可以在不涉及外部进程的情况下处理更多内容。

答案 2 :(得分:8)

如果您在脚本开头执行cd,则应在脚本退出时将其还原。

#!/bin/bash

cd src
for i in * ; do
  if [ -d "$i" ]; then
    echo "$i"
  fi
done

答案 3 :(得分:4)

basename用作:

if [ -d "$i" ]; then
    basename "$i"
fi