2017-02-03 210 views
1

我試圖將所有子文件夾中的某個文件類型的所有文件複製到一個地方。不幸的是,如果兩個文件在兩個不同的子文件夾中具有相同的名稱,這可能會導致衝突。避免衝突,如果複製文件

我用

find ./ -name '*.jpg' -exec mv -u '{}' . \; 

如何調整這個自動重命名文件(例如追加「_1」),以避免衝突。 或更好:預先檢查文件是否相同(例如相同大小)。如果是,忽略(覆蓋也可以)。如果否,則重命名以避免碰撞。

建議將不勝感激。謝謝!

+0

而不是EXEC'mv',EXEC'的bash -c爲碰撞那麼'TEST mv'​​' –

回答

0

您可以在移動每個單獨的文件之前進行檢查。在這裏,我使用cksum進行比較,它將返回文件大小和簡單的校驗和。

find ./ -name '*.jpg' -print0 | 
while read -d '' -r path; do 
    file=$(basename "$path") 
    if [[ -e $file ]]; then 
     if [[ $(cksum "$file" | awk '{print $1 $2}') = $(cksum "$path" | awk '{print $1 $2}') ]]; then 
      continue 
     fi 
     read -n 1 -p "File '$file' would be overwritten by '$path', continue? (y/N) " -r prompt </dev/tty 
     if [[ $prompt != [Yy] ]]; then 
      continue 
     fi 
    fi 
    mv -f -v "$path" "$file" 
done 
+0

我們可以用'CMP -s',看看兩個文件是相同的,而不是兩個'cksum's? – codeforester

+0

@codeforester絕對,這將是更好的事情。我最初寫了'stat -c%s'來演示OP的想法,但這不是可移植的(它是macOS上的'stat -f%z'),所以我到達了'cksum',它也輸出了大小。 – ephemient

+0

好的,這有幫助。但我也想沒有任何提示。如果它們相同,我不在乎它是否被覆蓋(如果不是,則最好刪除要複製的文件)。 但是,如果文件有不同的cksum,它也應該自動重命名,因爲我確信我想在這種情況下保留這兩個文件。 – StegSchreck