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