私の顧客の一つは学校です。ファイルサーバーでは、すべてのプロジェクトに同じ名前付けスキームを持つディレクトリがあります。
<姓>、<名前> <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
マッチングに関する限り、強力なものを構築するには非常に注意する必要があります。たとえば、名前と中間名を考えてみましょう。
- 文字で始める必要があります。
- ハイフンを含めることができます(ただし、他の句読点やスペースは含めることはできません)。
名前パターンは次のとおりです。追加の非キャプチャグループ構造は、中間名が空の場合にキャプチャグループ番号付けの連続性を維持するのに役立ちます。したがって、オプションでスペースで区切られ[[: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
。