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



有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/windows 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比旧的MS/DOS继承的CMD.EXE更通用,并且有简单易用的forif复合命令。只要看看@Halley Oliveira对你用例语法的回答就知道了。

关于您正在尝试的最简单和可靠的方法是使用find . -type f -name "*.txt"收集文件,这将找到当前目录下以".txt"结尾的所有文件。要限制为仅使用当前目录,请在-type ...之前添加-maxdepth 1。要确保正确处理带有空格或其他奇怪字符的文件名,请添加-print0选项以确保文件名为空终止。总之,您可以使用以下命令收集文件:

find . -maxdepth 1 -type f -name "*.txt" -print0

现在要处理文件,复制它们以在文件名中添加一个.cp结尾(扩展名),您可以使用GNUxargs使用-0选项来处理以空结尾的文件名,并使用-I '{}'replace-str选项来处理将在xargs命令中替换'{}'的每个文件名。把这些放在一起,你会得到:

xargs -0 -I '{}' cp -a '{}' '{}.cp'

上面您只需复制(cp -a)保留属性'{}''{}.cp'添加.cp扩展。

把它们放在一起,您只需将find输出管道到xargs,例如:

find . -maxdepth 1 -type f -name "*.txt" -print0 | xargs -0 -I '{}' cp -a '{}' '{}.cp'

如果你想要一个完整的快速示例,只需创建文件,然后向自己证明它按预期工作,例如

$ touch {1..3}.txt
$ find . -maxdepth 1 -type f -name "*.txt" -print0 | xargs -0 -I '{}' cp -a '{}' '{}.cp'

当前目录下的结果文件:

$ ls -al [1-3]*
-rw-r--r-- 1 david david 0 Aug 24 19:07 1.txt
-rw-r--r-- 1 david david 0 Aug 24 19:07 1.txt.cp
-rw-r--r-- 1 david david 0 Aug 24 19:07 2.txt
-rw-r--r-- 1 david david 0 Aug 24 19:07 2.txt.cp
-rw-r--r-- 1 david david 0 Aug 24 19:07 3.txt
-rw-r--r-- 1 david david 0 Aug 24 19:07 3.txt.cp

如果你有问题请告诉我。还有许多其他方法可以定制find命令,以匹配您想要查找的内容,如果需要,使用正则表达式而不是简单的文件全局查找。

相关内容

  • 没有找到相关文章

最新更新