それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ファイル名の全角半角統一する。(uconv )

ファイル名に全角半角を混ぜないで

混ぜないでと言っても、混ぜないでと何度いっても、全角半角(日本語と英語)を混ぜる人がいる。

大抵は、プログラミングで補えるところなので入力補助でサポートされるよね。でも、ファイル名になると、バリデーションなんてないためにガンガンに使われる。もうね、コンピュータ使うなと言いたいんだけど、ファイルの概念すら希薄になるつつあるので、もう絶対に無理なんだろうなと思う。

シェルでサクッと対応する

uconv で対応(半角ー>全角)

echo "AX20-BXa"| uconv -x "Halfwidth-Fullwidth"
AX20-BXa

nkf で対応(全角ー>半角)

echo "AX20-BXa"| nkf -m0Z1
"AX20-BXa"

NKF のほうがコマンド文字数が少ないので、個人的にはアリなのだが。NKFは現在ではインストールが必要だったり、半角→全角がめんどうだったりするので、uconv が良さそうです。

ファイル名を変更する

ls や awkbash と組み合わせて使う。

paste <(ls ) <(ls |  uconv -x "Fullwidth-Halfwidth" )

実行結果はこの様になる。

ax20-Bxa.txt       ax20-Bxa.txt

ここから、mv コマンドとか作ったり、xargsを使ったりする・

paste <(ls ) <(ls |  uconv -x "Fullwidth-Halfwidth" ) | sed 's/^/mv /' |

実行結果はこのようになる。

mv ax20-Bxa.txt       ax20-Bxa.txt

この結果を実行すれば良い

paste <(ls ) <(ls |  uconv -x "Fullwidth-Halfwidth" ) | sed 's/^/mv /' | bash

ポイント

サブシェルの実行結果をファイルとして、1つのコマンドに複数のファイルを与えるコマンドで実行結果をファイルとして取り出す

paste a b 

この a b の箇所を「コマンドの結果に変える」

paste <(ls) <(ls | uconv)

<( command ) として書く。このとき <( との間にスペースは無用。 必ずスペース抜きで、<( sub command) として書く。

サブシェルが実行されて結果が標準入力に渡されファイルとして扱われる。

参考資料

https://qiita.com/ko1nksm/items/7c31a2759579e6a1b65b