スペース、アンダースコア、ドットを削除してダッシュに置き換える bash スクリプトを作成しようとしています。また、小文字に設定し、ブラケットを削除します。それは(長い)2番目のsedコマンドで、うまくいくようです。
最初の sed 呼び出しは、タブで完了するときのように、元の名前を「\」でスペースを使用してエスケープします。これが問題だと思います。
'mv -i' を 'echo' に置き換えると、元のファイル名がバックスラッシュでエスケープされ、新しい名前が付けられます。これを端末に貼り付けると機能しますが、スクリプトに mv を使用するとスペースが問題を引き起こします。エスケープは機能しません。
#!/bin/bash
for a in "$@"; do
mv -i $(echo "$a" | sed -e 's/ /\\\ /g') $(echo "$a" | sed -e 's/\(.*\)/\L\1/' -e 's/_/-/g' -e 's/ /-/g' -e 's/---/--/g' -e 's/(//g' -e 's/)//g' -e 's/\[//g' -e 's/\]//g' -e 's/\./-/g' -e 's/-\([^-]*\)$/\.\1/')
done
もう 1 つの解決策は、名前を引用符で囲むことですが、これを行う方法がわかりません。近づいた気がしますが、困っています。
「rename」コマンドも検討しましたが、sed のように複数の操作を行うことはできません。
他の問題を指摘してください。これは私の最初のスクリプトの 1 つです。「$@」または「$a」ビットが完全に正しいかどうかはわかりません。
乾杯。
編集:
サンプル入力ファイル名
I am a Badly [named] (file) - PLEASE.rename_me.JPG
なるべき
i-am-a-badly-named-file--please-rename-me.jpg
edit2: gniourf_gniourf の本当に役立つ純粋な bash の回答から微調整した私のソリューション:
#!/bin/bash
for a in "$@"; do
b=${a,,} #lowercase
b=${b//[_[:space:]\.]/-} #subst dot,space,underscore with dash
b=${b//---/--} #remove triple dash
b=${b//[()\[\]]/} #remove brackets
if [ "${b%-*}" != "$b" ]; then #if there is a dash (prevents filename.filename)
b=${b%-*}.${b##*-} #replace final dash with a dot for extension
fi
if [ "$a" != "$b" ]; then #if there has been a change
echo '--->' "$b" #
#mv -i -- "$a" "$b" #rename
fi
done
これは、ファイルにスペースなどがあり、拡張子がない場合にのみ失敗します (たとえば、this BAD_filename
になりthis-bad.filename
ます。ただし、これらはメディア ファイルであり、拡張子が必要なので、とにかく並べ替える必要があります。
繰り返しますが、修正と改善を歓迎します。私はこのようなことに慣れていません