有3个txt文件,名为
1.txt 2.txt 3.txt
我想批量复制该名称
1.txt.cp 2.txt.cp 3.txt.cp
使用通配符
*
。
我输入了命令
cp *.txt *.txt.cp
,但它不起作用。
cp : target *.txt.cp : is not a directory
有什么问题吗?
用途:
for i in *.txt; do cp "$i" "$i.cp"; done
示例:
$ ls -l *.txt
-rw-r--r-- 1 halley halley 20 out 27 08:14 1.txt
-rw-r--r-- 1 halley halley 25 out 27 08:14 2.txt
-rw-r--r-- 1 halley halley 33 out 27 08:15 3.txt
$ ls -l *.cp
ls: could not access '*.cp': File or directory does not exist
$ for i in *.txt; do cp "$i" "$i.cp"; done
$ ls -l *.cp
-rw-r--r-- 1 halley halley 20 out 27 08:32 1.txt.cp
-rw-r--r-- 1 halley halley 25 out 27 08:32 2.txt.cp
-rw-r--r-- 1 halley halley 33 out 27 08:32 3.txt.cp
$ for i in *.txt; do diff "$i" "$i.cp"; done
$
如果您习惯了 MS/Windown CMD shell,请务必注意 Unix 系统对通配符的处理方式非常不同。 MS/Windows 保留了 MS/DOS 规则,即不解释通配符,而是将其传递给命令。该命令会看到通配符,并可以处理命令中的第二个
*
,以指出第一个匹配项的位置,从而使 copy ab.* cd.*
变得合理。
在 Unix(以及 Linux 等衍生版本)中,shell 负责处理通配符,并将任何包含通配符的单词替换为所有可能的匹配项。好消息是指挥部不必关心这个。但缺点是,如果当前文件夹包含 ab.txt ab.md5 cd.jpg,命令
copy ab.* cd.*
将被翻译为 copy ab.txt ab.md5 cd.jpg
,这可能不是你所期望的...
根本原因是 Unix shell 比继承 CMD.EXE 的老式 MS/DOS 更加通用,并且具有简单易用的
for
和 if
复合命令。只需查看@Halley Oliveira 的answer,了解适合您用例的语法。