2017-07-19 137 views
0

我有兩個連續內容的目錄(即內容的文件名爲001.jpg,002.jpg,003.jpg等等,最多可達1000個文件) 。我想將它們合併到一個新的目錄中交替順序如下所示:將兩個目錄的內容交織到一個新目錄

Dir1 
├── 001.jpg 
├── 002.jpg 
├── 003.jpg 
└── 004.jpg 
Dir2 
├── 002.jpg 
├── 003.jpg 
├── 004.jpg 
└── 005.jpg 

OutputDir 
├── 001.jpg (001.jpg from Dir1) 
├── 002.jpg (002.jpg from Dir2) 
├── 003.jpg (002.jpg from Dir1) 
├── 004.jpg (003.jpg from Dir2) 
├── 005.jpg (003.jpg from Dir1) 
├── 006.jpg (004.jpg from Dir2) 
├── 007.jpg (004.jpg from Dir1) 
└── 008.jpg (005.jpg from Dir2) 

這是我有,但它依賴於兩個迪爾斯具有相同名稱:

cp Dir1/* OutputDir/ 
cp --backup=existing --suffix=.2 Dir2/* OutputDir/ 
cd OutputDir 
# next line from here: https://stackoverflow.com/questions/3211595/renaming-files-in-a-folder-to-sequential-numbers 
ls | cat -n | while read n f; do mv "$f" "$n.jpg"; done 

我希望的一個不依賴於兩個目錄的文件名相同的解決方案。

回答

2

這是一種方法。

#! /bin/bash 
a=(Dir1/*) 
b=(Dir2/*) 
for ((i=0;i<${#a[@]};++i)); do 
    mv "${a[i]}" "OutputDir/$(printf '%03d.jpg' "$((2*i+1))")" 
    mv "${b[i]}" "OutputDir/$(printf '%03d.jpg' "$((2*i+2))")" 
done 

它假定Dir1和Dir2中的文件數量相同,但您的示例意味着這是真的。

+0

您可能希望完全刪除*命令替換*和'ls',只允許* globbing *來填充數組。但是,你和ghoti都會得到幾乎同時答案的投票':)'我仍然困惑於哪個文件獲得下一個序號邏輯(或缺少邏輯)的邏輯。 –

+0

非常感謝。完成。 – Gene

+0

我忘了說明,但是兩個目錄都有相同數量的文件。 –

2

假設兩個輸入目錄有相同數量的每個文件,你也許可以簡單地通過數組索引步驟,就像這樣:

#!/usr/bin/env bash 

a=(Dir1/*.jpg) 
b=(Dir2/*.jpg) 
n=1 

for i in "${!a[@]}"; do 
    mv "${a[$i]}" "OutputDir/$(printf '%03d' $n).jpg" 
    ((n++)) 
    mv "${b[$i]}" "OutputDir/$(printf '%03d' $n).jpg" 
    ((n++)) 
done 

如果有可能,他們將有不同數量文件,您需要爲其定義行爲並編寫一些內容來處理它。也許這:

#!/usr/bin/env bash 

a=(Dir1/*.jpg) 
b=(Dir2/*.jpg) 

if [[ ${#a[@]} -gt ${#b[@]} ]]; then 
     c=(${!a[@]}) 
else 
     c=(${!b[@]}) 
fi 

n=1 

for i in "${c[@]}"; do 
    echo "i=$i" 
    [[ -f "${a[$i]}" ]] && 
     mv -v "${a[$i]}" "OutputDir/$(printf '%03d' $n).jpg" && ((n++)) 
    [[ -f "${b[$i]}" ]] && 
     mv -v "${b[$i]}" "OutputDir/$(printf '%03d' $n).jpg" && ((n++)) 
done 

通過這一解決方案,如果一個目錄比其他更多的文件,其文件應依次OutputDir同一櫃檯下面所附的。請注意,((n++))僅在移動成功時纔會執行,這應確保您的輸出文件連續不間斷。

這裏的依賴關係是數組索引必須是順序的,沒有中斷。

+0

在蛋糕上結冰應該是((n> = 1000))&& break'':)' –

+0

@ DavidC.Rankin - 這個更新是如何結冰的? :) – ghoti

+0

如果我可以投票兩次 - 這將是值得兩倍。就像我對Gene評論的那樣,當你們倆都回答的時候,我仍然在想如何排列哪個文件的序列號。幹得好':)' –

相關問題