動機
Webブラウザで資料検索やネット取引での領収書やチケットのPDFファイルをダウンロードすることが多いが、毎回保存先フォルダを選択して指定するほどマメではないので、ブラウザのデフォルトのダウンロードフォルダーにどんどん溜まっていく。よくあるのが、しばらく前にダウンロードとしたのと同じファイルをダウンロードしてしまい、無駄にどんどんディクスクペースを消費してしまうこと。定期的に重複しているファイルを消そうと思っても意外と手間のかかる作業なので、作業をスクリプト化した。
作業内容
このクリーンアップ作業を面倒くさく(=ワンライナー化が困難に)させているのは下記の点である。
- Webブラウザがダウンロードしたファイルを保存するときにすでに同じ名前のファイルが既存の場合、
basename.extension
を、basename(1).extension
,basename(2).extension
とか、basename-1.extension
,basename-2.extension
といったように拡張子を除いた部分に数字を追記して保存する。このときFirefoxだと'(数字)'を追記する方式で、Safariだと'-数字'を追記する方式だったりして、ブラウザごとにネーミングルールの個性がある。 - 同じファイルを何回もダウンロードしてしまうことがあり、重複ファイルの個数がいくつもある場合がある。
- ファイル名の拡張子認識の区切りが必ずしも最後の
.
とは限らない。たとえば、'foo.tar.gz'に対して’foo(1).tar.gz’という名前になったりするので、必ずしも1つの拡張子の分離(${filename##*.}(1).${filename%.*}
)ではあてはまらない場合がある。 - ファイル名の書き換えルールに従っていても必ずしも内容が同じファイルとは限らない。たとえば、某航空会社のWebサイトから航空券(eチケット)のファイルを複数回ダウンロードすると'eTicket.pdf' ,'eTicket(1).pdf','eTicket(2).pdf',...というファイルがどんどんできていくが、重複ファイルのネーミングルールに従ってはいても、実際には別の予約便のチケットのファイルの可能性がある。
この辺をよろしくやってくれるようにスクリプト化する。ファイル名の処理に関してはsed
のお世話になることにした。ファイルの同一性の確認はdiff
にお願いする。ほかに、find
,sort
コマンドに依存している。想定しているネーミングルールは、'(数字)'追記タイプと'-数字'追記タイプの2通りを想定。
実装
- https://github.com/nanigashi-uji/cleanup_duplicated
- https://gitlab.com/nanigashi_uji/cleanup_duplicated
MacOS上で動作確認してましたが、試す場合には必ず-n
オプションをつけて大事なファイルを消そうとしていないか確認してほしい。(やっちゃっても無保証です。)
(ヘルプ表示)
% ./cleanup_duplicated -h[Usage] % cleanup_duplicated [options]
[Options]
-d path : Set target directory
-D depth : Set search depth (defalut: 2)-i : invoke rm with -i optiond
-n : "Dryrun"-mode-v : Show verbose output
-m num : Set possible maximum index
-h : Show Help (this message)
-d
オプションで指定しない場合には、${HOME}/Downloads
以下をクリーンアップする。-m
オプションを用意したのは、たまたまファイル名にfoo-YYYYmmddHHMMSS.tgz
とか、foo(YYYYmmddHHMMSS).tgz
といった、年号日付をつけたファイルがあった場合に膨大な数の重複ファイル候補を探しにいってしまってほぼ無限ループに陥ってしまうのを回避するため。