ファイル名に全角半角を混ぜないで
混ぜないでと言っても、混ぜないでと何度いっても、全角半角(日本語と英語)を混ぜる人がいる。
大抵は、プログラミングで補えるところなので入力補助でサポートされるよね。でも、ファイル名になると、バリデーションなんてないためにガンガンに使われる。もうね、コンピュータ使うなと言いたいんだけど、ファイルの概念すら希薄になるつつあるので、もう絶対に無理なんだろうなと思う。
シェルでサクッと対応する
uconv で対応(半角ー>全角)
echo "AX20-BXa"| uconv -x "Halfwidth-Fullwidth" AX20-BXa
nkf で対応(全角ー>半角)
echo "AX20-BXa"| nkf -m0Z1 "AX20-BXa"
NKF のほうがコマンド文字数が少ないので、個人的にはアリなのだが。NKFは現在ではインストールが必要だったり、半角→全角がめんどうだったりするので、uconv が良さそうです。
ファイル名を変更する
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)
として書く。
サブシェルが実行されて結果が標準入力に渡されファイルとして扱われる。