拡張子の異なる同じファイルを削除するワンライナー

# よりいい方法!


@ko1nksm さんよりコメントを頂いて、ワンライナーではないやりかたを紹介いただきました。
そちらもご覧ください。
https://qiita.com/nanbuwks/items/7f09b7aaed9ae17c4c1e#comment-8b55ed21b6de59a66bce

# 以下ワンライナーの方法

録画設定を適当にやっていて、m2ts ファイルと mp4 ファイルが2つ残ってしまった。
同じファイル名のもののうち、m2ts ファイルを削除するワンライナーを作成する。


# 環境
```
# cat /etc/issue
Ubuntu 20.04.4 LTS \n \l
```

# ニーズ

録画サーバーで EPGStation を動かしている。
録画予約したものは、録画後 mp4 にトランスコーディングして、元ファイルの m2ts ファイルを削除するようになっている。
しかし録画設定をいいかげんにやっていたら m2ts ファイルが削除されていないものが沢山できてしまった。m2ts ファイルを残しておくと容量を圧迫するので削除したい。

m2ts ファイルを全部削除すればいいということではなくて・・・

```
# ls  2022年*.mp4 2022年*.m2ts | head
2022年08月23日21時54分00秒-Ａｒｔｉｓｔ＃１８Ｆｉｌｅ　★今月のアーティストはＤＥＥＰ　ＹＵＩＣＨＩＲＯ.m2ts
2022年08月23日22時00分00秒-国際報道２０２２　侵攻半年　ウクライナ市民はいま.m2ts
2022年08月23日23時00分00秒-金装のヴェルメイユ～崖っぷち魔術師は最強の厄災と魔法世界を突き進む～　＃８.m2ts
2022年08月23日23時30分00秒-旅するためのフランス語（２０）「今月のおさらい」.m2ts
2022年08月23日23時55分00秒-Ｅテレ２３５５　火曜日.m2ts
2022年08月23日23時55分00秒-みんなのスポーツ　MLB野球＆サッカー＆五輪種目を深掘り！.m2ts
2022年08月23日23時55分00秒-選「鬼太郎が見た玉砕〜水木しげるの戦争〜」.m2ts
2022年08月24日00時00分00秒-＜アニメギルド＞継母の連れ子が元カノだった　＃７.m2ts
2022年08月24日00時00分00秒-アニメ　連盟空軍航空魔法音楽隊ルミナスウィッチーズ　第7話　太陽の理由.m2ts
2022年08月24日00時30分00秒-＜アニメギルド＞転生賢者の異世界ライフ　＃９.m2ts
```

 mp4 ファイルを作成しておらず、m2ts ファイルだけしか無いものもあるのでそれは消さずに残したい。

# 削除ルール

- 拡張子が .mp4 ファイルと .m2ts ファイルで同じ名前のファイルを探す
- 該当のファイルのうち、.m2ts ファイルだけ削除する

なお、トランスコード失敗で .mp4 ファイルの容量がゼロになっているものがあるが、それは予め除外しておく。

# step-by-step

まずは、mp4ファイルとm2tsファイル両方のリストから、拡張子を除外したリストを得る

```
# ls  2022年*.mp4 2022年*.m2ts | awk -F. '{ print $1 }'  | head
2022年08月23日21時54分00秒-Ａｒｔｉｓｔ＃１８Ｆｉｌｅ　★今月のアーティストはＤＥＥＰ　ＹＵＩＣＨＩＲＯ
2022年08月23日22時00分00秒-国際報道２０２２　侵攻半年　ウクライナ市民はいま
2022年08月23日23時00分00秒-金装のヴェルメイユ～崖っぷち魔術師は最強の厄災と魔法世界を突き進む～　＃８
2022年08月23日23時30分00秒-旅するためのフランス語（２０）「今月のおさらい」
2022年08月23日23時55分00秒-Ｅテレ２３５５　火曜日
2022年08月23日23時55分00秒-みんなのスポーツ　MLB野球＆サッカー＆五輪種目を深掘り！
2022年08月23日23時55分00秒-選「鬼太郎が見た玉砕〜水木しげるの戦争〜」
2022年08月24日00時00分00秒-＜アニメギルド＞継母の連れ子が元カノだった　＃７
2022年08月24日00時00分00秒-アニメ　連盟空軍航空魔法音楽隊ルミナスウィッチーズ　第7話　太陽の理由
2022年08月24日00時30分00秒-＜アニメギルド＞転生賢者の異世界ライフ　＃９
```
なお、ドットが複数あるファイルは考慮していないのでもしそのようなものが想定される場合は要注意。

次に、.m2ts と .mp4 の2つが存在するファイル名リスト(拡張子除外)を得る

```

# ls  2022年*.mp4 2022年*.m2ts | awk -F. '{ print $1 }' | uniq -d | head
2022年08月25日23時30分00秒-はたらく魔王さま！！　＃07「魔王、銚子と世界の広さを知る」
2022年08月25日23時30分00秒-はたらく魔王さま！！　＃７「魔王、銚子と世界の広さを知る」[字]
2022年08月26日01時20分00秒-ＮＨＫスペシャル「ウクライナ侵攻半年　～“プーチンの戦争”出口はどこに～」[字][再]
2022年08月27日19時00分00秒-SDガンダムワールド ヒーローズ　第22話「窮奇、襲来」
2022年08月27日19時30分00秒-機動戦士ガンダムSEED DESTINY　PHASE-30「刹那の夢」
2022年08月27日23時30分00秒-レギュラー番組への道　再生できないホームビデオありませんか？６▽亡き妻から娘へ[字]
2022年08月28日00時00分00秒-アニメ　てっぺんっ!!!!!!!!!!!!!!!　＃９「アダムスキーの章」
2022年08月28日00時00分00秒-アニメ　キングダム　第４シリーズ（２１）「唯一の勝機」[字]
2022年08月28日00時30分00秒-Ｅｎｇａｇｅ　Ｋｉｓｓ　＃９「流す涙の意味を知らずに」
2022年08月28日00時30分00秒-アニメ　継母の連れ子が元カノだった　#8
```



ファイル名に mv コマンドと mv 先をつけたスクリプト形式のリストを作る


```
# ls  2022年*.mp4 2022年*.m2ts | awk -F. '{ print $1 }' | uniq -d | awk -F. '{ print "mv \""$1".m2ts\" double"}' | head
mv "2022年08月25日23時30分00秒-はたらく魔王さま！！　＃07「魔王、銚子と世界の広さを知る」.m2ts" double
mv "2022年08月25日23時30分00秒-はたらく魔王さま！！　＃７「魔王、銚子と世界の広さを知る」[字].m2ts" double
mv "2022年08月26日01時20分00秒-ＮＨＫスペシャル「ウクライナ侵攻半年　～“プーチンの戦争”出口はどこに～」[字][再].m2ts" double
mv "2022年08月27日19時00分00秒-SDガンダムワールド ヒーローズ　第22話「窮奇、襲来」.m2ts" double
mv "2022年08月27日19時30分00秒-機動戦士ガンダムSEED DESTINY　PHASE-30「刹那の夢」.m2ts" double
mv "2022年08月27日23時30分00秒-レギュラー番組への道　再生できないホームビデオありませんか？６▽亡き妻から娘へ[字].m2ts" double
mv "2022年08月28日00時00分00秒-アニメ　てっぺんっ!!!!!!!!!!!!!!!　＃９「アダムスキーの章」.m2ts" double
mv "2022年08月28日00時00分00秒-アニメ　キングダム　第４シリーズ（２１）「唯一の勝機」[字].m2ts" double
mv "2022年08月28日00時30分00秒-Ｅｎｇａｇｅ　Ｋｉｓｓ　＃９「流す涙の意味を知らずに」.m2ts" double
mv "2022年08月28日00時30分00秒-アニメ　継母の連れ子が元カノだった　#8.m2ts" double

```
スクリプトで指定しているのは、ファイル一覧を一度に削除するのではなく、一度 double フォルダに移動というようにしています。

なお、ファイル名をダブルクォートで囲んでいますが、ファイル名にダブルクォートが入っているものがあると問題が起きるので、そのようなファイル名が想定される場合は別途対応が必要でしょう。

# 本番


削除対象を一時的に移動するフォルダを作成します。


```
# mkdir double
```

スクリプトファイル double.sh を作成する

```
# ls  2022年*.mp4 2022年*.m2ts | awk -F. '{ print $1 }' | uniq -d | awk -F. '{ print "mv \""$1".m2ts\" double"}' > mvdouble.sh
```
スクリプトファイルを確認し、問題ないようなら実行する。

```
# sh mvdouble.sh

```

double フォルダを確認

```
# cd double
# ls | head
2022年08月25日23時30分00秒-はたらく魔王さま！！　＃07「魔王、銚子と世界の広さを知る」.m2ts
2022年08月25日23時30分00秒-はたらく魔王さま！！　＃７「魔王、銚子と世界の広さを知る」[字].m2ts
2022年08月26日01時20分00秒-ＮＨＫスペシャル「ウクライナ侵攻半年　～“プーチンの戦争”出口はどこに～」[字][再].m2ts
2022年08月27日19時00分00秒-SDガンダムワールド ヒーローズ　第22話「窮奇、襲来」.m2ts
2022年08月27日19時30分00秒-機動戦士ガンダムSEED DESTINY　PHASE-30「刹那の夢」.m2ts
2022年08月27日23時30分00秒-レギュラー番組への道　再生できないホームビデオありませんか？６▽亡き妻から娘へ[字].m2ts
2022年08月28日00時00分00秒-アニメ　てっぺんっ!!!!!!!!!!!!!!!　＃９「アダムスキーの章」.m2ts
2022年08月28日00時00分00秒-アニメ　キングダム　第４シリーズ（２１）「唯一の勝機」[字].m2ts
2022年08月28日00時30分00秒-Ｅｎｇａｇｅ　Ｋｉｓｓ　＃９「流す涙の意味を知らずに」.m2ts
2022年08月28日00時30分00秒-アニメ　継母の連れ子が元カノだった　#8.m2ts
# ls | wc
    492    1131   59123
# du -h
1.6T	.
```

削除実行

```
# cd ..
# rm -rf double

```

# 応用

以下のようなことができますね!

- ls を工夫して、別々のところにあるファイルでダブっているのを削除
- 沢山できたバックアップファイルを整理
- フィルターを用いて判定条件を追加したり