Bash:为什么输入'cp hey foo*'时,文件会被复制到最后一个目录?
Bash: Why a file will be copied into the last directory when typed 'cp hey foo*'?
结构如下
james/
hey /foo1 /foo2 /foo3
键入此命令时
cp hey foo*
我收到以下通知
cp: omitting directory 'foo1'
cp: omitting directory 'foo2'
并且文件 hey 被复制到 foo3 目录中。
为什么会这样?
为什么哎被复制到foo3目录下,为什么foo1和foo2 ?
当你这样做时:
cp hey foo*
bash 扩展 参数。在您的情况下,命令行扩展为
cp hey foo1 foo2 foo3
最后一个参数是目标 file/directory。 cp
拒绝复制目录,除非设置了 -R/-r
选项,因此会出现消息。
并且 hey
文件被复制到 foo3
cp
或任何其他命令无法区分带有 *
的命令行和带有扩展参数的命令行,例如与 Windows cmd 不同。
如果您成功将实际的 *
字符传递给 cp
(例如:cp foo\* bar
),那么 cp
将检查名为 foo*
的文件。命令中没有通配符机制扩展(Windows 端口中有一些,但那是另一回事)
注意:这不是应该使用的方式:
- 如果您知道只有目录带有
foo
前缀,这可能是一种在不知道目录名称的情况下复制文件的方法。
- 更经典的用法:
cp *.txt foo
注2:危险情况:如果你有file1
和file2
,你想把它们复制到foo
,你输入cp file*
,省略[=24] =](或误击RETURN),它将复制file1
overfile2
(在不扩展通配符的shell中发生)。
在你的情况下,如果你想将 hey
复制到所有 foo*
目录,你必须进行循环:
for target in foo*
do
cp hey "$target"
done
结构如下
james/
hey /foo1 /foo2 /foo3
键入此命令时
cp hey foo*
我收到以下通知
cp: omitting directory 'foo1'
cp: omitting directory 'foo2'
并且文件 hey 被复制到 foo3 目录中。
为什么会这样? 为什么哎被复制到foo3目录下,为什么foo1和foo2 ?
当你这样做时:
cp hey foo*
bash 扩展 参数。在您的情况下,命令行扩展为
cp hey foo1 foo2 foo3
最后一个参数是目标 file/directory。 cp
拒绝复制目录,除非设置了 -R/-r
选项,因此会出现消息。
并且 hey
文件被复制到 foo3
cp
或任何其他命令无法区分带有 *
的命令行和带有扩展参数的命令行,例如与 Windows cmd 不同。
如果您成功将实际的 *
字符传递给 cp
(例如:cp foo\* bar
),那么 cp
将检查名为 foo*
的文件。命令中没有通配符机制扩展(Windows 端口中有一些,但那是另一回事)
注意:这不是应该使用的方式:
- 如果您知道只有目录带有
foo
前缀,这可能是一种在不知道目录名称的情况下复制文件的方法。 - 更经典的用法:
cp *.txt foo
注2:危险情况:如果你有file1
和file2
,你想把它们复制到foo
,你输入cp file*
,省略[=24] =](或误击RETURN),它将复制file1
overfile2
(在不扩展通配符的shell中发生)。
在你的情况下,如果你想将 hey
复制到所有 foo*
目录,你必须进行循环:
for target in foo*
do
cp hey "$target"
done