首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash:循环时将目录名设置为变量

Bash:循环时将目录名设置为变量
EN

Stack Overflow用户
提问于 2020-10-08 19:40:07
回答 2查看 33关注 0票数 0

我有一个包含大量子目录的目录。我需要遍历所有子目录并保存它的名称(没有路径!)作为一个不同的变量

代码语言:javascript
复制
for d in ${output}/*/
do
   dir_name=${d%*/}
   echo ${dir_name}
done

当前版本的问题是,它为我提供了目录的完整路径。下面是echo的结果

代码语言:javascript
复制
/Users/gleb/Desktop/DOcking/clusterizator/sub_folders_to_analyse/7000_CNE_lig992
/Users/gleb/Desktop/DOcking/clusterizator/sub_folders_to_analyse/7000_CNE_lig993
/Users/gleb/Desktop/DOcking/clusterizator/sub_folders_to_analyse/7000_CNE_lig994
/Users/gleb/Desktop/DOcking/clusterizator/sub_folders_to_analyse/7000_CNE_lig995
/Users/gleb/Desktop/DOcking/clusterizator/sub_folders_to_analyse/7000_CNE_lig996
/Users/gleb/Desktop/DOcking/clusterizator/sub_folders_to_analyse/7000_CNE_lig997
/Users/gleb/Desktop/DOcking/clusterizator/sub_folders_to_analyse/7000_CNE_lig998
/Users/gleb/Desktop/DOcking/clusterizator/sub_folders_to_analyse/7000_CNE_lig999
EN

回答 2

Stack Overflow用户

发布于 2020-10-08 20:05:26

使用dir_name=${d%*/}时,您只需删除尾随的/。您还需要删除直到最后一个/的所有内容。或者尝试basename,这可能是一个更好的选择。

如下所示:

代码语言:javascript
复制
for d in /var/*/ ; do  
    dir_name=${d%/}
    base=$(basename "$d")
    echo "$d $dir_name  ${dir_name##*/} $base"
done

这会产生:

代码语言:javascript
复制
/var/adm/ /var/adm  adm adm
/var/cache/ /var/cache  cache cache
/var/db/ /var/db  db db
/var/empty/ /var/empty  empty empty
/var/games/ /var/games  games games
/var/heimdal/ /var/heimdal  heimdal heimdal
/var/kerberos/ /var/kerberos  kerberos kerberos
/var/lib/ /var/lib  lib lib
/var/lock/ /var/lock  lock lock
/var/log/ /var/log  log log
/var/mail/ /var/mail  mail mail
/var/man/ /var/man  man man
/var/named/ /var/named  named named
/var/netatalk/ /var/netatalk  netatalk netatalk
/var/run/ /var/run  run run
/var/slapt-get/ /var/slapt-get  slapt-get slapt-get
/var/spool/ /var/spool  spool spool
/var/state/ /var/state  state state
/var/tmp/ /var/tmp  tmp tmp
/var/www/ /var/www  www www
/var/yp/ /var/yp  yp yp

(在我的系统上)。

票数 1
EN

Stack Overflow用户

发布于 2020-10-08 21:36:13

你能通过cd连接到那个父目录吗?

代码语言:javascript
复制
cd ${output}/
lst=( */ )
for d in "${lst[@]}"; do echo "${d*/}"; done

如果这不是一个选项,那么你可以每次都去掉它。

代码语言:javascript
复制
lst=( ${output}/*/ )
for d in "${lst[@]}"; do dir="${d*/}"; echo "${dir##/}"; done

作为一个混合体,您有时可以使用更改子subshell中的目录的技巧,因为cd是子subshell的本地文件,当它结束时会“消失”,但任何赋值都是如此。

代码语言:javascript
复制
cd /tmp
( cd ${output}/; lst=( */ ); for d in "${lst[@]}"; do echo "${d*/}"; done )
# in /tmp here, lst array does not exist any more...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64261769

复制
相关文章

相似问题

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