仅限Bash中的文件

Joh*_*n P 6 bash glob

我在Bash中遇到了一些问题.例如:

echo *
Run Code Online (Sandbox Code Playgroud)

这将打印出当前目录中的所有文件和文件夹.例如(file1 file2 folder1 folder2)

echo */
Run Code Online (Sandbox Code Playgroud)

这将使用名称后面的/打印出所有文件夹.例如(folder1/folder2 /)

我怎么能只为文件选择?例如(file1 file2)

我知道这可以通过解析ls来完成,但也知道这是一个坏主意.我尝试使用扩展blobbing,但也无法使用它.

anu*_*ava 9

无需使用任何外部工具,你可以尝试for loop使用glob support:

for i in *; do [ -f "$i" ] && echo "$i"; done
Run Code Online (Sandbox Code Playgroud)

  • @JohnP,是的.你也可以用`[!-d"$ i"]`来测试当前项目是*不是目录* - 然后你会包含符号链接和其他类型的文件,只是显式不是目录. (3认同)

Oli*_*rth 5

我不知道你是否可以通过globbing来解决这个问题,但你可以用find来解决它:

find . -type f -maxdepth 1
Run Code Online (Sandbox Code Playgroud)


小智 5

你可以在 bash 中做你想做的事情,如下所示:

shopt -s extglob
echo !(*/)
Run Code Online (Sandbox Code Playgroud)

但请注意,这实际上是匹配“非目录类”。
它仍然会匹配悬空符号链接、指向非目录、设备节点、fifo 等的符号链接。

但它不会匹配指向目录的符号链接。

如果您只想迭代普通文件,请使用find -maxdepth 1 -type f.

安全可靠的使用方法如下:

find -maxdepth 1 -type f -print0 | while read -d $'\0' file; do
  printf "%s\n" "$file"
done
Run Code Online (Sandbox Code Playgroud)

  • 您的仅 bash 解决方案与我的“echo *”完全相同 (6认同)
  • 另外,要激活 extglob 选项,您必须使用 `shopt -s extglob`,因为 `shopt extglob` 仅显示是否设置了该选项。 (3认同)
  • 支持使用 find 的安全方法,请注意“extglob”解决方案不起作用,至少在 bash 5 中不起作用。 (2认同)