如何在 bash 中列出不带尾随 / 的文件夹

如何在 bash 中列出不带尾随 / 的文件夹

我知道

ls -d */

列出当前目录中的所有文件夹为dir1/ dir2/ dir3/

是否有可能在 bash 脚本中将文件夹显示为dir1 dir2 dir3

答案1

仅获取目录但省略斜杠:

ls -d */ | sed 's#/##'

或者你必须使用类似的find . -type d -maxdepth 1(但这会引入./前缀)

答案2

使用find(这还将摆脱使用时通常会在前面添加的./或):/path/to/find

find . -maxdepth 1 -type d -printf '%f\n'

上述命令将包含.点文件(通常会被隐藏)。要避免所有以点开头的目录(至少使用 GNU find 时):

find . -maxdepth 1 -type d ! -name '.*' -printf '%f\n'

如果您想查看隐藏目录,但又不想要.,您可以使用(再次,仅在 GNU find 上测试过,与其他版本的 find 相比可能有所不同):

find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'

纯的bash

for f in */; do echo "${f%/}"; done

下面有点作弊,因为它实际上/用空格替换了(所以在脚本中不是很有用,但如果您想要稍微漂亮一点的输出,您可能会喜欢它):

printf '%s\b \n' */

或者,你可以使用zsh而不是bash并利用其glob 限定符

ls -d *(/)

答案3

您可以使用

ls -d */ | awk -F/ '{print$1}'

它将 ls 输出通过管道传输到 awk,并告诉它考虑 / 作为字段分隔符,并仅打印第一个字段

答案4

简单结合dirname

touch dir{1..3}
ls -d ./dir*
# ./dir1  ./dir2  ./dir3
ls -d ./dir* | xargs -I {} basename {}
# dir1
# dir2
# dir3

相关内容