我有一个包含大量子目录的目录。我需要遍历所有子目录并保存它的名称(没有路径!)作为一个不同的变量
for d in ${output}/*/
do
dir_name=${d%*/}
echo ${dir_name}
done当前版本的问题是,它为我提供了目录的完整路径。下面是echo的结果
/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发布于 2020-10-08 20:05:26
使用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(在我的系统上)。
发布于 2020-10-08 21:36:13
你能通过cd连接到那个父目录吗?
cd ${output}/
lst=( */ )
for d in "${lst[@]}"; do echo "${d*/}"; done如果这不是一个选项,那么你可以每次都去掉它。
lst=( ${output}/*/ )
for d in "${lst[@]}"; do dir="${d*/}"; echo "${dir##/}"; done作为一个混合体,您有时可以使用更改子subshell中的目录的技巧,因为cd是子subshell的本地文件,当它结束时会“消失”,但任何赋值都是如此。
cd /tmp
( cd ${output}/; lst=( */ ); for d in "${lst[@]}"; do echo "${d*/}"; done )
# in /tmp here, lst array does not exist any more...https://stackoverflow.com/questions/64261769
复制相似问题