【问题标题】:Bash: set name of directory as a variable while loopingBash:在循环时将目录名称设置为变量
【发布时间】:2020-10-08 11:40:07
【问题描述】:

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

for d in ${output}/*/
do
   dir_name=${d%*/}
   echo ${dir_name}
done

当前版本的问题是它给了我目录的完整路径。这是回显的结果

/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

【问题讨论】:

  • 试试命令basename
  • 你也可以使用 dir_name=${d##*/}

标签: bash variables directory


【解决方案1】:

使用dir_name=${d%*/},您只需删除结尾的/。您还需要删除最后一个 / 之前的所有内容。或者试试basename,这也许是一个更好的选择。

如:

for d in /var/*/ ; do  
    dir_name=${d%/}
    base=$(basename "$d")
    echo "$d $dir_name  ${dir_name##*/} $base"
done

产生:

/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

(在我的系统上)。

【讨论】:

    【解决方案2】:

    你能cd 到那个父目录吗?

    cd ${output}/
    lst=( */ )
    for d in "${lst[@]}"; do echo "${d*/}"; done
    

    如果这不是一个选项,那么您可以每次都剥离它。

    lst=( ${output}/*/ )
    for d in "${lst[@]}"; do dir="${d*/}"; echo "${dir##/}"; done
    

    作为混合体,您有时可以使用更改子shell 内的目录的技巧,因为cd 是子shell 的本地变量,并且在它结束时“消失”,但任何分配也是如此。

    cd /tmp
    ( cd ${output}/; lst=( */ ); for d in "${lst[@]}"; do echo "${d*/}"; done )
    # in /tmp here, lst array does not exist any more...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      相关资源
      最近更新 更多