首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Linux中循环遍历目录?

如何在Linux中循环遍历目录?
EN

Stack Overflow用户
提问于 2010-01-21 16:57:22
回答 11查看 268.5K关注 0票数 215

我正在Linux上的bash中编写脚本,需要遍历给定目录中的所有子目录名称。如何遍历这些目录(并跳过常规文件)?

为例:

给定的目录为/tmp/

它包含以下子目录:/tmp/A, /tmp/B, /tmp/C

我想检索A,B,C。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-01-21 17:04:02

代码语言:javascript
复制
cd /tmp
find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'

一个简短的解释:

  • find查找文件(相当于obviously)
  • .是当前目录,在cd之后是/tmp (我的意思是,这比在find命令中直接使用/tmp更灵活。您只需要更改一个位置,即cd,如果您希望在此result
  • -type d和directories
  • -printf '%f\n中执行更多操作,请确保find只在当前目录中查找,而不将.本身包含在result
  • -type d中。只查找directories
  • -printf '%f\n,每次命中都只打印找到的文件夹的名称(加上换行符)。

就是这样!

票数 141
EN

Stack Overflow用户

发布于 2010-01-21 18:08:57

到目前为止,所有的答案都使用find,所以这里只有一个带有外壳的答案。在您的案例中不需要外部工具:

代码语言:javascript
复制
for dir in /tmp/*/     # list directories in the form "/tmp/dirname/"
do
    dir=${dir%*/}      # remove the trailing "/"
    echo "${dir##*/}"    # print everything after the final "/"
done
票数 539
EN

Stack Overflow用户

发布于 2013-10-21 11:21:13

您可以使用以下命令遍历所有目录,包括隐藏目录(以点开头):

代码语言:javascript
复制
for file in */ .*/ ; do echo "$file is a directory"; done

注意:只有当文件夹中至少存在一个隐藏目录时,才能在zsh中使用列表*/ .*/。在bash中,它还将显示...

bash包含隐藏目录的另一种可能性是使用:

代码语言:javascript
复制
shopt -s dotglob;
for file in */ ; do echo "$file is a directory"; done

如果要排除符号链接:

代码语言:javascript
复制
for file in */ ; do 
  if [[ -d "$file" && ! -L "$file" ]]; then
    echo "$file is a directory"; 
  fi; 
done

要在每个解决方案中仅输出尾部目录名(A、B、C),请在循环中使用以下命令:

代码语言:javascript
复制
file="${file%/}"     # strip trailing slash
file="${file##*/}"   # strip path and leading slash
echo "$file is the directoryname without slashes"

示例(这也适用于包含空格的目录):

代码语言:javascript
复制
mkdir /tmp/A /tmp/B /tmp/C "/tmp/ dir with spaces"
for file in /tmp/*/ ; do file="${file%/}"; echo "${file##*/}"; done
票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2107945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档