如何在没有完整路径的情况下创建给定文件夹中的子文件夹列表?

如何在没有完整路径的情况下创建给定文件夹中的子文件夹列表?

Bash 脚本如下:

find /Volumes/SpeedyG -type d >> file.txt

...在文本文件中列出该路径中的文件夹效果很好,

/Volumes/SpeedyG/folder1  
/Volumes/SpeedyG/folder2  
/Volumes/SpeedyG/folder2

但结果是文件夹的完整路径。

如果我只想要文件夹名称而不需要完整路径怎么办?


folder1  
folder2  
folder3  

答案1

对于的 GNU 实现find,您可以使用格式化的输出操作来执行此操作printf

          %P     File's name with the name  of  the  starting-point  under
                 which it was found removed.

所以

find /Volumes/SpeedyG -type d -printf '%P\n' >> file.txt

如果你想删除全部前导目录组件,您可以使用%f代替%P。如果您有,您可以使用递归 shell 通配符和(tail) 限定符zsh执行相同操作::t

print -rC1 /Volumes/SpeedyG/**/*(ND/:t)

find在这种情况下,你根本不需要。对于任何 POSIX sh,你总是可以这样做

find dir -type d -exec sh -c '
  for f do printf "%s\n" "${f##*/}"; done
' find-sh {} +

答案2

tree -di /Volumes/SpeedyG将为您提供仅子文件夹的列表。

tree -dia /Volumes/SpeedyG将为您提供仅包含隐藏目录的子文件夹列表。

tree -diL 1 /Volumes/SpeedyG将为您提供仅 1 级子文件夹的列表。

注意:如果目录是另一个目录的符号链接,则该行输出将显示目标目录的链接和路径...
您可以使用类似 grep 语句将其消除tree -di /Volumes/SpeedyG | grep -v "\->"

答案3

GNUbasename从完整路径名中删除所有前导目录组件。

$ basename /Volumes/SpeedyG/folder1
folder1

要处理多个路径名,请使用以下--multiple选项:

‘-a’
‘--multiple’
     Support more than one argument.  Treat every argument as a NAME.
     With this, an optional SUFFIX must be specified using the ‘-s’
     option.

$ basename -a /Volumes/SpeedyG/folder1 /Volumes/SpeedyG/folder2 /Volumes/SpeedyG/folder3
folder1
folder2
folder3

在脚本中,去除最大前缀的更有效的方法是采用参数扩展,如下所示:

file="/Volumes/SpeedyG/folder1"
file="${file##/*/}"

您可以在for循环中利用这一点:

for i in /Volumes/SpeedyG/*
do
    printf "%s\n" "${i##/*/}"
done > $HOME/files.txt

$ cat ~/files.txt
folder1
folder2
folder3

相关内容