在我的 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 很可能是bash
或dash
或sh
,或类似的东西 - 您可以echo $0
在提示符下运行以查看正在运行的内容。
如上所述,通配符由 shell(而不是应用程序)处理,扩展的默认行为可能有点出乎意料。例如,Bash 将使用以下行为:
- 如果
/home/user
不存在或者其中没有任何内容,则/home/user/*
不会扩展,而是保持原样(即/home/user/*
:)。 - 如果
/home/user
是一个包含两个文件a
和b
的目录,那么/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-print0
和xargs
'-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