💻

条件に合うファイル/ディレクトリを一括で操作・圧縮するコマンド

2022/08/27に公開

コピペで使えるコマンドを羅列しています。使用しているコマンドの解説をしているのでそれを参考に修正を行うと良いかと思います。

ディレクトリの移動

  • カレントディレクトリの3階層下にあるディレクトリを検索
  • 検索したものをカレントディレクトリに移動する
find ./*/*/* -type d -print0 | xargs -0 -J% mv % ./

圧縮

  • ディレクトリを個別に圧縮
  • 元のファイルは消去
find . -type d -print0 -exec rar a {} {}.rar {} \; -exec rm -r {} \;
Tips.1 rar

winrarをコマンドラインから使える。macはbrewでインストール可能。

rar a [圧縮したいファイルorディレクトリ] output.rar
Tips.2 圧縮方式
  • zip
  • rar
    zipよりもrarの方が圧縮効率が優れる

動画エンコード

  • ffmpegでディレクトリ下のmkvファイルをmp4(H.265)にエンコード
  • 元ファイルの拡張子だけ変えて出力する(movie.mkvmovie.mp4)
  • 元のファイルは消去
find . -name '*.mkv' -print0 -exec bash -c 'ffmpeg -i "$0" -c:v libx265 -c:a aac -tag:v hvc1 -y "${0/mkv/mp4}"' {} \; -exec rm {} \;

ffmpegではファイルにスペースが場合、なぜか別々のファイルとして認識されてしまう。それを避ける方法としてbashの-cオプションを使う方法が紹介されていた。試したところ期待通りの挙動となった。
https://stackoverflow.com/questions/20496798/command-find-and-convert-using-ffmpeg

Tips.1 ビデオコーデックについて
  • libx264(H.264)
  • libx265(H.265)

H265はH264の半分以下に収まる(すごい)が、エンコードに相当の時間がかかる。両者をより詳しく比較している記事を発見したのでリンクを貼っておく。

https://life.craftz.dog/entry/save-storage-with-h265-ffmpeg

Tips.2 音声コーデックについて
  • mp3
  • aac

mp3は互換性に優れる一方で、aacは圧縮率・音質共に優れる

補足: Findコマンド

オプションを渡してフィルタをかけることができる。findに似たコマンドとして、ファイルの中身に対してフィルタをかけるgrepがある。

  • ファイル名で検索/パターンマッチ(-name)
  • 対象をファイルまたはディレクトリに絞る(-type)
  • スペースを区切り文字として使わない(-print0)

該当するファイル及びディレクトリに対して処理をかける方法

2種類の方法がある。

  • findで使える、-execオプションを使う
  • xargsにパイプで渡す

基本的にxargsの方が性能に優れる。理由としては-execは該当のファイル/ディレクトリに対し1つ1つ逐次的に処理を行うことしかできないが、xargsは一括で並列的に処理を行うことが可能。また、書き方もシンプル。

xargs

find ... | xargs [行う処理]
  • -0
    スペースを区切り文字として扱わないようにする。ファイル名にスペースがある場合、これをつけないと思い通りの挙動にならない

https://ola.kironono.com/entry/2017/02/01/080000

  • -J(-I)
    受け取った引数を任意の場所で渡すことができる。-Jは一括で渡すのに対して、-Iは個別に渡す。用途に応じて使い分ける。

https://www.web-dev-qa-db-ja.com/ja/xargs/xargs`j`オプション/962617242/

参考リンク
https://www.xmisao.com/2013/09/01/how-to-use-find-and-xargs.html

Discussion