为什么这在 shell for 循环中起作用,但本身不起作用

Kir*_*irt 1 bash

为什么这有效

for X in A* ; do cp $X/output.txt output/$X.txt ; done
Run Code Online (Sandbox Code Playgroud)

但不是这个

cp A*/output.txt output/A*.txt
Run Code Online (Sandbox Code Playgroud)

用于将 output.txt 文件从名为 A1、A2、A3、A4 等的多个文件夹复制到一个名为“output”的组合文件夹中,为每个文本文件提供它来自的文件夹的名称。

use*_*ser 5

因为在传递给正在调用的命令(在本例中)之前,shell 会将A*.txt部件扩展为多个路径cp

这意味着在第一种情况下,如果您有名为 A1.txt、A2.txt、A3.txt 和 A4.txt 的文件以及每个包含 output.txt 的目录 A1、A2、A3 和 A4,它会扩展为如下内容

for X in A1.txt A2.txt A3.txt A4.txt ; do cp $X/output.txt output/$X.txt ; done
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,它扩展为:

cp A1/output.txt A2/output.txt A3/output.txt A4/output.txt output/A*.txt
Run Code Online (Sandbox Code Playgroud)

output/A*.txt根据output目录中是否存在与 glob 匹配的任何内容,该部分可能会或可能不会扩展。如果是这样,情况会变得更糟,例如:

cp A1/output.txt A2/output.txt A3/output.txt A4/output.txt output/A8.txt output/A9.txt
Run Code Online (Sandbox Code Playgroud)

因为cp当给定的多个源文件最后想要一个目标目录时,它不知道如何处理这个问题,只是举手并给你一个错误。