2011-08-21 33 views
0

我有文件序列:bash腳本,以編號的文件複製以相反的順序

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

爲什麼不直接向視頻創建工具提供圖片列表,然後向後? –

+0

因爲我使用gifsicle(製作gif)和ffmpeg(製作mpg)等幾個命令行工具,並且正在使用大量(100-200張圖像),這可能會超過可接受命令的長度。還是沒有這種限制? –

+0

這取決於您的工具如何獲取輸入的文件名。不幸的是,似乎ffmpeg沒有辦法將包含文件名列表的文件作爲輸入。 –

回答

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以上,你會遇到八進制問題。

+0

如果文件名中有非法字符,如下劃線,則此操作失敗,BC不喜歡。 – cde

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 
+0

不錯的腳本,但它會生成多餘的副本,無論如何+1。 –

+0

對於給定的情況,最好是用'ln'代替'cp'文件。 – glglgl

+0

它應該是'for((i = 1; i <= MAX/2; i ++));??或者我猜結果是一樣的,所以更簡單的版本更好 –