我有一系列文件:
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
括号中的文字不是文件名的一部分。
为什么需要它?我正在从一系列图像创建视频,并希望视频播放“前进”然后“后退”(循环播放生成的视频)。
答案 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,就会遇到八进制问题。