文件命令不接受通配符

文件命令不接受通配符

在我的 Linux 机器上,我可以使用 file 命令列出目录的内容,方法如下:

file /home/user/*

它打印 /home/user/ 目录中每个文件的文件类型。这样,我就可以知道该目录中所有文件的列表。

但是,在远程 Linux 机器上,我无法在文件命令中使用通配符。

file /home/user/*
/home/user/*: cannot open `/home/user/*' (No such file or directory)

在某些版本的 Linux 上,文件命令是否不支持通配符?或者这是一个限制?

谢谢。

答案1

file实用程序不处理通配符,但 shell 可以处理......

shell 很可能是bashdashsh,或类似的东西 - 您可以echo $0在提示符下运行以查看正在运行的内容。


如上所述,通配符由 shell(而不是应用程序)处理,扩展的默认行为可能有点出乎意料。例如,Bash 将使用以下行为:

  • 如果/home/user不存在或者其中没有任何内容,则/home/user/*不会扩展,而是保持原样(即/home/user/*:)。
  • 如果/home/user是一个包含两个文件ab的目录,那么/home/user/*将扩展为/home/user/a /home/user/b

使用 bash,您可以:

  • 禁用“通配符“完全靠跑步set -f,或者
  • 展开“全局如果通过运行 未匹配任何内容,则将“ ”更改为“无” shopt -s nullglob

这意味着:

  • 远程 shell 根本不支持通配符
  • 远程 shell 默认禁用通配符(请尝试运行set +f以启用它)

如果你的最终目标真的是“find在所有实体上运行/home/user/“,那么您可以尝试以下操作:

find /home/user/ -maxdepth 1 -type f -print0 \
    | xargs -0 file
  • -maxdepth 1防止递归
  • -type f仅显示文件(不显示目录、符号链接等...)
  • find's-print0xargs'-0参数一起使用以使用 NUL 字符 ( \0) 来分隔条目,因为特殊字符换行符 ( \n) 在文件名中有效。
  • xargs将使用通过提供的记录stdin,并将它们用作指定命令的附加参数(file在本例中)

默认 (set +f/ shopt -u nullglob

$ tree
.
└── x

1 directory, 0 files
$ echo glob x/*
glob x/*
$ touch x/a x/b
$ tree
.
└── x
    ├── a
    └── b
$ echo glob x/*
glob x/a x/b

无通配符 ( set -f/ shopt -u nullglob)

$ tree
.
└── x

1 directory, 0 files
$ echo glob x/*
glob x/*
$ touch x/a x/b
$ tree
.
└── x
    ├── a
    └── b
$ echo glob x/*
glob x/*

空值全局扩展 ( set +f/ shopt -s nullglob)

$ tree
.
└── x

1 directory, 0 files
$ echo glob x/*
glob 
$ touch x/a x/b
$ tree
.
└── x
    ├── a
    └── b
$ echo glob x/*
glob x/a x/b

相关内容