数字のファイル名だけを削除する

7-1.ファイル・アーカイブ


TVアニメ『Re:ゼロから始める異世界生活』のEDテーマです。神秘的な音楽が本作に合っています。アニメの内容はタイトルのままでゼロから始めるってのをRe:します。せっかく運良く勝ち取ったように見えた人間関係も全部消えて一から築き直し。それが続くのに凹むどころか、もっと良くしようと頑張る主人公。ストーリーがマンネリになってきたなあと思ったら、すぐに急展開で面白くなって、を繰り返します。
今回のテーマはrmコマンドですが、いっそのことPCの中身をすべてrmしてしまって、一から構築し直せば、もっと効率的な仕事ができるようになるかもしれません。しかし、たとえ生産性が手に入れられるとしても、rmする勇気は私にはないです。

(Linux入門はコチラ→中級者のためのLinuxコマンド入門)

ワイルドカードと一緒に使うことの多いrmコマンドですが、毎度のようにコマンドを実行するときに、本当に消して良いものか不安になります。
rm *.bkと実行しようとして、 rm *まで入力した時、何かの拍子にEnterを押してしまい、ディレクトリ内のすべてのファイルが消えてしまう、というような事故は起こらないようにしたいですね。 大事なファイルはバージョン管理するので、大丈夫ではありますが。

rm の削除時に確認をしたいときは、-i、-Iオプションが使えます。まずは実験用に適当なファイルを生成します。

~$ touch {1..10} a{1..10} {1..10}b
~$ ls
1   10b  2   3   4   5   6   7   8   9   a1   a2  a4  a6  a8
10  1b   2b  3b  4b  5b  6b  7b  8b  9b  a10  a3  a5  a7  a9
~$ 

rm -i を使います。確認メッセージに対して、Enterだけの入力ではファイルは削除されません。

~$ rm -i *
rm: 通常の空ファイル `1' を削除しますか? 
rm: 通常の空ファイル `10' を削除しますか? 
rm: 通常の空ファイル `10b' を削除しますか? 
rm: 通常の空ファイル `1b' を削除しますか? ^C
~$ rm -i *
rm: 通常の空ファイル `1' を削除しますか? 
rm: 通常の空ファイル `10' を削除しますか? 
rm: 通常の空ファイル `10b' を削除しますか? 
rm: 通常の空ファイル `1b' を削除しますか? 
(省略)

下のように、最初の一文字がyまたはYの時に、削除されます。
Thank youでは、消してくれないのに、You’re kiddingは消されてしまいますので、注意が必要です。

~$ rm -i *
rm: 通常の空ファイル `1' を削除しますか? y
rm: 通常の空ファイル `10' を削除しますか? Y
rm: 通常の空ファイル `10b' を削除しますか? yes
rm: 通常の空ファイル `1b' を削除しますか? yeah
rm: 通常の空ファイル `2' を削除しますか? yap
rm: 通常の空ファイル `2b' を削除しますか? ya
rm: 通常の空ファイル `3' を削除しますか? yoshi
rm: 通常の空ファイル `3b' を削除しますか? yummy
rm: 通常の空ファイル `4' を削除しますか? yuck
rm: 通常の空ファイル `4b' を削除しますか? You're kidding
rm: 通常の空ファイル `5' を削除しますか? Thank you
rm: 通常の空ファイル `5b' を削除しますか? ^C
~$ rm -i *
rm: 通常の空ファイル `5' を削除しますか? 
rm: 通常の空ファイル `5b' を削除しますか? 

-iではファイル一つずつに対して削除確認されましたが、-Iにするとまとめての確認となります。こちらに関しても、削除確認の際にEnterだけでは削除されず、yもしくはYにてまとめて削除ができます。

~$ rm *
~$ touch {1..10} a{1..10} {1..10}b
~$ rm -I *
rm: remove 30 arguments? 
~$ ls
1   10b  2   3   4   5   6   7   8   9   a1   a2  a4  a6  a8
10  1b   2b  3b  4b  5b  6b  7b  8b  9b  a10  a3  a5  a7  a9
~$ rm -I *
rm: remove 30 arguments? y
~$ ls
~$ 

次は特定のファイルの削除をしてみましょう。実験用ファイルを再度作成します。

~$ rm *
~$ touch {1..10} a{1..10} {1..10}b

今、以下の3種のファイルが存在します。
・aから始まるファイル
・bで終わるファイル
・それ以外の数字だけで構成されるファイル

順に消して行きましょう。まずは、aから始まるファイルから

~$ rm -I a*
rm: remove 10 arguments? y
~$ ls
1  10  10b  1b  2  2b  3  3b  4  4b  5  5b  6  6b  7  7b  8  8b  9  9b
~$ 

次は、1b〜5bを消します。

~$ rm -I {1..5}b
rm: remove 5 arguments? y
~$ ls
1  10  10b  2  3  4  5  6  6b  7  7b  8  8b  9  9b
~$ 

次は、6〜9が付く名前のファイル(6〜9、6b〜9b)を消します。

~$ rm -I {6..9}*
rm: remove 8 arguments? y
~$ ls
1  10  10b  2  3  4  5
~$ 

{A..B}等グロブを使えば、規則正しいファイル名の場合は削除できる気はするのですが、複雑なファイル名に対応できる気がしません。
ファイル名が複雑な場合、どのように削除すれば良いでしょうか。
複雑なファイルをランダムに作ってみます。

~$ shuf /usr/share/dict/words | head -20 | sed s/\'// | xargs touch
~$ for i in `seq 20`;do touch $RANDOM;done
~$ ls
12874  18894  28545  6975          altimeters  downer        sloughing
13908  20472  30055  7542          baffle      gangs         spending
1455   21891  30508  Americanisms  celestas    obsidians     sullennesss
16186  21905  31379  Amys          chaperones  particulates  vulcanization
16710  21969  4904   Hibernia      daybreak    rabbis
18735  24431  5167   Rosemarie     dictums     ribald
~$ 

このランダムなファイル名の中から、数字だけで構成されるファイルを削除してみましょう。
正規表現を使います。

~$ rename 's/^(\d+)$/$1.del/' *
~$ ls
12874.del  20472.del  30508.del     Amys        daybreak      ribald
13908.del  21891.del  31379.del     Hibernia    dictums       sloughing
1455.del   21905.del  4904.del      Rosemarie   downer        spending
16186.del  21969.del  5167.del      altimeters  gangs         sullennesss
16710.del  24431.del  6975.del      baffle      obsidians     vulcanization
18735.del  28545.del  7542.del      celestas    particulates
18894.del  30055.del  Americanisms  chaperones  rabbis
~$ rm -I *.del
rm: remove 20 arguments? y
~$ ls
Americanisms  altimeters  daybreak  obsidians     sloughing
Amys          baffle      dictums   particulates  spending
Hibernia      celestas    downer    rabbis        sullennesss
Rosemarie     chaperones  gangs     ribald        vulcanization
~$ 

正規表現を使って、renameコマンドで一旦ファイル名を変更した後に、rmで削除を行ないました。
rmが正規表現が使えなくて不便なら、renameを使えば良いってことですね。

コメント

タイトルとURLをコピーしました