有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更通用,并且有简单易用的for
和if
复合命令。只要看看@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
命令,以匹配您想要查找的内容,如果需要,使用正则表达式而不是简单的文件全局查找。