Bash脚本以相反的顺序复制编号的文件

时间:2011-08-21 03:55:31

标签: linux bash sequence rename

我有一系列文件:

image001.jpg
image002.jpg
image003.jpg

您能否帮助我使用bash脚本以相反的顺序复制图像,以便最终结果为:

image001.jpg
image002.jpg
image003.jpg
image004.jpg  <-- copy of image003.jpg
image005.jpg  <-- copy of image002.jpg
image006.jpg  <-- copy of image001.jpg

括号中的文字不是文件名的一部分。

为什么需要它?我正在从一系列图像创建视频,并希望视频播放“前进”然后“后退”(循环播放生成的视频)。

2 个答案:

答案 0 :(得分:3)

您可以使用printf打印前导为0的数字。

$ printf '%03d\n' 1
001
$ printf '%03d\n' 2
002
$ printf '%03d\n' 3
003

将其投入for循环会产生:

MAX=6

for ((i=1; i<=MAX; i++)); do
    cp $(printf 'image%03d.jpg' $i) $(printf 'image%03d.jpg' $((MAX-i+1)))
done

答案 1 :(得分:1)

我认为我会使用一个数组......就这样,你不需要为$ MAX硬编码一个值。

image=( image*.jpg )
MAX=${#image[*]}
for i in ${image[*]}
do
   num=${i:5:3} # grab the digits
   compliment=$(printf '%03d' $(echo $MAX-$num | bc))
   ln $i copy_of_image$compliment.jpg
done

我使用'bc'进行算术运算,因为bash将前导0解释为数字为八进制的指示符,而bash中的参数扩展不足以剥离它们而不跳过箍。我本可以在sed中做到这一点,但只要我在bash之外调用某些东西,直接进行算术就更有意义了。

我认为Kuegelman的剧本可以做到这样的事情:

MAX=(ls image*.jpg | wc -l)

该脚本有更大的问题,因为它覆盖了一半的图像:

cp image001.jpg image006.jpg # wait wait!!! what happened to image006.jpg???

此外,一旦你超过007,就会遇到八进制问题。