使用通配符复制文件 * 为什么不起作用?

问题描述 投票:0回答:2

有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

有什么问题吗?

linux wildcard cp
2个回答
2
投票

用途:

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
$ 

1
投票

如果您习惯了 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,了解适合您用例的语法。

© www.soinside.com 2019 - 2024. All rights reserved.