我正在使用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