Command

ファイル名が同じで拡張子違いのファイルをマージする(1)

投稿日:

あるディレクトリに、以下の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 でヌル文字区切りを処理するようにする。

-Command

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

no image

プロセスが開いているファイルディスクリプタ数を調べる

例)sambaでつかんでいるファイルを確認したい 例)apacheがつかんでいるログファイルがどれか確認したい そんなとき。 プロセスIDはわかっている前提で。 ・lsofで lsof -p プロセス …

no image

findで所有者がrootのファイルを探す

findは様々な条件でファイルを検索できる。 所有者で検索も可能. $ find . -user root 所有者がrootのファイルを探すことができる。

no image

mysqldump+gzipでダンプ、mysql+zcatでリストア

ダンプ $ mysqldump db_hoge | gzip -c > db_hoge.sql.gz ダンプでオプション指定(文字化けするときなどに) $ mysqldump –default-ch …

no image

tmpwatchで古いファイルを探して消す

あるログファイルがたまっていくディレクトリで、30日(720時間)以上前の更新日のファイルを削除する。 $ tmpwatch -m 720 /path/to/log

no image

findで更新の条件で古いファイルや新しいファイルを探す

・更新日が3日前より新しい(現在時間〜72時間前) $ find . -mtime -3 ・更新日がちょうど3日前(72時間前〜96時間前) $ find . -mtime 3 ・更新日が3日前より古 …