1

スペース、アンダースコア、ドットを削除してダッシュに置き換える 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ます。ただし、これらはメディア ファイルであり、拡張子が必要なので、とにかく並べ替える必要があります。

繰り返しますが、修正と改善を歓迎します。私はこのようなことに慣れていません

4

2 に答える 2

4

でこれをやってみてくださいrename

rename 's/[_\s\.]/-/g' *files

shellプロンプトから。コードを内部に入れることができます。

-nテストが有効になったら、(dry-run モード スイッチ)を削除できます。

警告 これを行うことができる場合とできない場合がある同じ名前の他のツールがあるので、注意してください。

次のコマンドを実行すると ( linux)

$ file $(readlink -f $(type -p rename))

そして、あなたは次のような結果を持っています

.../rename: Perl script, ASCII text executable

次に、これは適切なツールのようです=)

そうでない場合、それをデフォルト(通常はすでにそうです)にするにはDebian、次のような派生物を使用しUbuntuます。

$ sudo update-alternatives --set rename /path/to/rename

/path/to/rename(コマンドのパスに置き換えますperl's rename


最後になりましたが、このツールはもともと、Perl の父である Larry Wall によって作成されました。

于 2013-10-29T19:32:14.033 に答える