在命令行中复制一系列文件(ZSH/BASH)

在命令行中复制一系列文件(ZSH/BASH)

我有一个以连续数字作为后缀的文件列表。我想只复制这些文件中的一部分。如何在 cp 命令中指定一个范围。

$ls
P1080272.JPG* P1080273.JPG* P1080274.JPG* P1080275.JPG* P1080276.JPG* P1080277.JPG*
P1080278.JPG* P1080279.JPG* P1080280.JPG* P1080281.JPG* P1080282.JPG* P1080283.JPG*

我想将文件从 P1080275.JPG 复制到 P1080283.JPG,内容类似如下:

$cp P10802[75-83].JPG ~/Images/.

有没有办法做到这一点?

答案1

你非常接近了。你的问题几乎是正确的语法:

cp P10802{75..83}.JPG ~/Images

答案2

要在 bash 中迭代某个范围:

for x in {0..10}; do echo $x; done

在您的案例中应用相同的方法:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done

答案3

Zsh 带有 extendedglob 选项 通配符(模式匹配)运算符。

setopt extendedglob
echo P10802<75-83>.JPG

将匹配当前目录中与该模式匹配的文件名(请注意,P1080275.JPG 匹配,但 P108020000000075.JPG 也匹配)

另一方面,{x ... y} 字符串扩展运算符(由 zsh 和较新版本的 bash 和 ksh93 支持)扩展为从 x 到 y 的字符串,而不管当前目录中有什么文件。

cp P10802<75-83>.JPG ~there

将复制匹配的文件,因此

cp P10802{75..83}.JPG ~there

但是如果 P1080281.JPG 不存在,您就会收到错误。

答案4

这对你有用吗:

for each in {75..83}; do cp P10802$each.JPG ~/Images/; done

相关内容