目录上的 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(shashdashkshbash zsh 等)。许多功能丰富的 shell(例如 kshbashzsh)还有其他扩展,可以在不涉及外部进程的情况下处理更多。

【讨论】:

【参考方案3】:

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

#!/bin/bash

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

【讨论】:

它应该……但如果你使用.source 命令来调用脚本,它不会。而是使用pushdpopd【参考方案4】:

basename 用作:

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

【讨论】:

以上是关于目录上的 Bash For-Loop的主要内容,如果未能解决你的问题,请参考以下文章

在谷歌云上的 bash 中获取正确的 $HOME 目录

Bash 递归替换名称上的许多空格

更改 Git Bash 上的默认位置

来自 root 帐户的 Bash 脚本和用户主目录 (Linux)

Linux 学习笔记 基本的bash shell命令

Linux根文件系统和目录结构及bash特性2