如何获取删除路径的目录的名称?

如何获取删除路径的目录的名称?

我正在使用for loop诸如

for j in ls ${folder}/*

获取我的目录内的所有子文件夹($folder)。

但我只想获取子目录的名称并想删除目录结构。我在xargs basenme处理文件时使用它,但在处理目录时却不行。

答案1

您可以获取所有文件夹的列表(恰好一个级别的子目录):

find /path/to/dir -maxdepth 1 -mindepth 1 -type d

您可以将结果通过管道传输到sed命令中,该命令将仅保留目录名称(不带前缀)

find /path/to/dir -maxdepth 1 -mindepth 1 -type d -print0 | sed -z 's!.*/!!' |tr '\0' '\n'

例子:

$ find /var -maxdepth 1 -mindepth 1  -type d 
/var/metrics
/var/lib
/var/local
/var/cache
/var/spool
/var/crash
/var/backups
/var/mail
/var/snap
/var/opt
/var/log
/var/tmp

$ find /var -maxdepth 1 -mindepth 1 -type d -print0 | sed -z 's!.*/!!' |tr '\0' '\n'
metrics
lib
local
cache
spool
crash
backups
mail
snap
opt
log
tmp

使用for循环:

$ for i in $(find /var -maxdepth 1 -mindepth 1 -type d -print0 | sed -z 's!.*/!!' |tr '\0' '\n'); do echo $i; done
metrics
lib
local
cache
spool
crash
backups
mail
snap
opt
log
tmp

for 循环重新排列:

$ for i in $(find /var -maxdepth 1 -mindepth 1 -type d -print0 | sed -z 's!.*/!!' |tr '\0' '\n'); 
    do 
    echo $i
  done

答案2

$folder/*/匹配 的每个子目录$folder。使用bash参数扩展剪切目录名称:

for j in $folder/*/; do
  j=${j%/}
  j=${j##*/}
done

这只是重新定义了j首先剪切最后一个斜杠,然后剪切所有内容直到字符串中的最后一个斜杠,实际上只留下子目录名称。

答案3

最好使用find命令而不是 for 循环。

find "$folder" -mindepth 1 -maxdepth 1 -type d -execdir printf '%s\n' '{}' +

这里我们使用了-execdir改变目录所在目录-d的路径,因此{}打印时将只包含目录名的最后一个元素。


或者使用find支持-printf格式化选项的 GNU。

find "$folder" -mindepth 1 -maxdepth 1 -type d -printf '%f\n'

-f意味着只返回最后一个元素,并且删除了所有前导目录。


笔记:这仅限于列出指定的子目录;您可以根据需要$folder调整/删除。-maxlength

相关内容