スクリプトは、ディレクトリ/サブディレクトリ内の各ファイルを繰り返し見て(シンボリックリンクをスキップ)、ファイル名を次のように置き換える必要があります。
- 複数の連続したスペースは1つのスペースのみです
- 複数の連続_1つだけを含む_
- 1つ以上の下線と1つ以上のスペース(下線は1つのみを含む)
- 下線の後 - 下線のみ
- - 後ろに下線が続き、下線のみが表示されます。
- 複数の連続した「.」には1点しかありません。
- ファイルサフィックスをすべて小文字にします(例:.PdFから.pdfへ)、これは単なる例です。
- @、$、または!などの文字を削除してください。
ベストアンサー1
使用find
とPerl rename
:
注:Perlは、さまざまなLinuxディストリビューションでは、、、または.perlrename
としても知られています。機能とコマンドラインオプションが完全に異なり、互換性のないユーティリティと混同しないでください。file-rename
perl-rename
prename
rename
util-linux
find . -type f -print0 |
rename -n -0 '
s/[\@\$!]//g; # remove all @, $, and ! characters.
# remove leading and trailing whitespace (if any) from filenames
s/^\s+|\s*\z//sg;
# change all runs of any whitespace to just one space
s/\s+/ /sg;
s/[- ]*([._])[- ]*/$1/g; # remove space(s) and - around _ and .
s/\.\.+/./g; # reduce multiple periods to just one
s/__+/_/g; # reduce multiple _ to just one
s/_*\._*/./g; # change _. and ._ to just .
s=(\.[^./]*\z)=lc($1)=e; # lowercase filename suffixes
'
3番目の代替タイプは、1つ以上の連続した空白文字(実際の空白文字、タブ、改行、フォームフィードなどを含む)を単一の空白文字に置き換えます。 IMOは要求されたもの以上ですが、ファイル名の空白文字のみを変更するよりも、さまざまな種類の空白文字をすべて変更する方が便利です。必要なものがない場合(スペース2つとスペース1つ)\s+
に変更してください +
。+
4番目の置換()s/[- ]*([_.])[- ]*/$1/g;
は、または前にスペースやダッシュ_
が必要ないと仮定します.
。これはあなたが要求したものよりも多いですが、実際に必要なものより多い場合は簡単に変更できます。
関連して、2番目の置換はとでのみ_.
置き換えられます。これを行うと、同じファイル名を取得できません。このようなファイル名が必要な場合は、この行を削除してください。._
.
foo_.bar_._pdf
最後の置換の正規表現修飾子e
は、置換がPerlコード(この場合はlc()
入力を小文字にする関数)として評価されるようにします。
注:-n
オプションの名前を変更して、実行するアクションのみを示すテスト実行にします。実際にファイル名を変更するには、ファイルを削除または-n
変更して-v
詳細な出力を取得します。
必要に応じて、複数行の名前変更スクリプトを1つの長く読み取れない行に圧縮することもできます(コメントを削除した場合)。#
ただし、追加の改行とインデントを使用すると、コマンドラインで読みやすく編集が簡単になります。そしてスクリプトから。
最後に、これはあなたが言うとき「ディレクトリ/サブディレクトリ内のすべてのファイルを参照する(シンボルリンクをスキップ)」また、名前の変更からディレクトリ、デバイスノード、名前付きパイプ、ソケットなどを除外したいと思います。つまり、通常のファイルだけが名前が変更されます。
一致するディレクトリの名前を変更するには、に-type f
変更find
する必要があります\( -type f -o -type d \)
。
もちろん、希望の find 述語を使用して検索を絞り込むこともできます。