2017-02-03 10 views
1

特定のファイルタイプのすべてのファイルをすべてのサブフォルダから1つの場所にコピーしようとしました。残念ながら、2つのファイルが2つの異なるサブフォルダから同じ名前を持っている場合、衝突が発生する可能性があります。私はファイルをコピーする場合、衝突を避ける

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

を使用していた

はどうやって衝突を避けるために、(例えば追加「_1」)に自動的にファイルの名前を変更するために、これを調整することができます。 またはそれ以上:ファイルが同じ(たとえば、同じサイズ)かどうかを事前に確認してください。はいの場合は無視してください(上書きも問題ありません)。いいえの場合は、名前を変更して衝突を回避します。

提案をいただければ幸いです。ありがとう!

+0

よりもむしろ幹部' mv'、幹部 'bashのその後 –

答えて

0

各ファイルを移動する前に確認できます。ここでは、cksumを使って比較しました。これは、ファイルサイズと単純なチェックサムの両方を返します。 CLASH FOR TEST "-c

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

は、我々は2つのファイルが代わりに2' cksum'sの同じかどうかを確認するために、CMP -s' '使用することはできmv''? – codeforester

+0

@codeforester絶対に、それは良いことです。私はもともとOPの考えを示す 'stat -c%s'を書いていましたが、それは移植性がありません(macOSでは' stat -f%z'です)ので、サイズを出力する 'cksum'に到達しました。 – ephemient

+0

申し分なく、助けてください。しかし私はまた、全くプロンプトを出さないことを望んでいます。それらが同じ場合は、上書きされているかどうかは気にしません(そうでない場合は、コピーするファイルを削除することを推奨します)。 しかし、ファイルに異なるcksumがある場合は、自動的に名前を変更する必要があります。この場合、両方のファイルを保持したいと思います。 – StegSchreck

関連する問題