ファイル名が同じで拡張子違いのファイルをマージする(1)
2018/02/21
linux
問題
あるディレクトリに、以下の3種類の拡張子のファイルが混在しているとき、
*.jpg
*.JPG
*.gif
以下のようなことをすることになりました。
・jpgがあればjpgをのこす。
・JPGと同じファイル名のjpgがあればJPGを削除。
・gifと同じファイル名のjpg、JPGがあればgifを削除。
答え
以下のコマンドで対応してみました。
ディレクトリに移動
$ cd /tmp/test
テストディレクトリ2個作成
$ mkdir src dist
コピー元ディレクトリへ移動
$ cd src
テストデータ作成
$ touch {1,2,4,5,7,8}.jpg {2,3,4,5,6,7}.JPG {0,3,6,9}.gif
実際にはコピー元のディレクトリの中にフラットに並んでおらず、フォルダ分けなどされている可能性も想定して
jpgを一番乗りでコピー
$ find . -name "*.jpg" | xargs -I {} sh -c 'f={} ; cp $f ../dist/$f'
JPGを席が空いていたらコピー
$ find . -name "*.JPG" | xargs -I {} sh -c 'f={} ; x=${f%.*} ; test -f ../dist/$x.jpg || cp $f ../dist/$x.JPG'
gifを席が空いていたらコピー
$ find . -name "*.gif" | xargs -I {} sh -c 'f={} ; x=${f%.*} ; test -f ../dist/$x.jpg || test -f ../dist/$x.JPG || cp $f ../dist/$x.gif'
ファイル名に空白が含まれることがある場合は、find は -print0 でヌル文字区切りで出力して、xargs は-0 でヌル文字区切りを処理するようにする。
コメント