シェルを使用してファイル名の単語を変更するには?

シェルを使用してファイル名の単語を変更するには?

私の顧客の一つは学校です。ファイルサーバーでは、すべてのプロジェクトに同じ名前付けスキームを持つディレクトリがあります。

<姓>、<名前> <2番目の名前>? - <プロジェクト説明>

たとえば、

Miller, John Andrew - 長いプロジェクトの説明
Willis, Bruce - 説明、コンマを含めることができます
Lewis, Mary Jane - 説明 - マイナス記号付き

新しい命名規則は次のとおりです。

<名前> <2位>? <姓> - <プロジェクトの説明>

たとえば、

John Andrew Miller - 長いプロジェクトの説明
ブルース・ウィリス(Bruce Willis) - 説明、カンマを含めることができる
Mary Jane Lewis - 説明 - マイナス記号付き

今、すべての既存のフォルダの名前を新しいルールに一括変更する方法は?

答え1

ファイル名の説明部分には、パターン-(2つのスペースの間のハイフン)を含めることができるため、特定のシンボルに変更できます。いいえ説明セクションに表示されます。を選択しましたが、£純粋にランダムでした。

rename 's/ - /£/' *
rename 's/([^,]*), ([^£]*)£/$2 $1 - /' *

s/ - /£/' tells rename to replace the first instance of- it finds with£ . The second command is a bit more complicated. Parenthases (() ) are used to group selections together -- so everything that matches the pattern within the first set of parens can be called later as$1 (all the way up to$9 ).[^,] means 'any character, except for,';means 'zero or more of the previous character';[^,]`は、「カンマ以外のすべての文字が0個以上ある」を意味します。名前の変更は基本的に貪欲なので、可能な限り長い文字列と一致します。

残りは自然に出てくると思います。

ファイル名に記号が表示されるかどうかわからない場合は、次を実行してください。

printf '%s\n' *£*

Perl-renameがある場合:

rename 's/([^,]*), (.*) - /$2 $1 - /' *

ファイル名の説明部分に-(たとえば、-2つのスペースの間にaが含まれている場合)、問題が発生します。

テストにはこのフラグを使用する必要があります-n。ファイル名は変更されませんが、その内容が表示されます。会議完成した:

rename -n 's/([^,]*), (.*) - /$2 $1 - /' *

答え2

マッチングに関する限り、強力なものを構築するには非常に注意する必要があります。たとえば、名前と中間名を考えてみましょう。

  1. 文字で始める必要があります。
  2. ハイフンを含めることができます(ただし、他の句読点やスペースは含めることはできません)。

名前パターンは次のとおりです。追加の非キャプチャグループ構造は、中間名が空の場合にキャプチャグループ番号付けの連続性を維持するのに役立ちます。したがって、オプションでスペースで区切られ[[:alpha:]][[:alpha:]-]*た中間名を作成できます。((?: [[:alpha:]][[:alpha:]-]*)?)たとえば、Perl ベースの rename コマンドを使用して一緒にまとめます。

rename -nv -- 's/(^[^,]*), ([[:alpha:]][[:alpha:]-]*)((?: [[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *

または(単一のスペースの代わりにフィールド間のより一般的なスペースを許可する)

rename -nv -- 's/(^[^,]*),\s+([[:alpha:]][[:alpha:]-]*)((?:\s+[[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *

この-nスイッチは機能しません。つまり、削除されるまで実際に名前を変更しません。 Perlベースの名前変更機能がない場合は、およびをperl組み合わせて使用​​できますmv

関連情報