で始まるファイルとディレクトリがあります「カテゴリアイコン」多くのサブディレクトリにあります。再帰的に名前を変更しようとしています「カテゴリアイコン」不足している部分を追加しました「グ」にカテゴリーそして「s」の終わりにアイコン。
複数のファイルとディレクトリの名前変更に関する他の質問をたくさん調べましたが、どれもうまくいきませんでした。
回答について少し説明していただければ幸いです。
編集済み: ディレクトリ構造の例を以下に示します。
test/cateory-icon-archery/cateory-icon-archery.png
[email protected]
test/cateory-icon-automotive/cateory-icon-automotive.png
[email protected]
答え1
これを再帰的に実行する必要があるため、find
を使用するのが最適です。名前を変更するには、呼び出しsh
で を使用できます-exec
。次に例を示します。
find /some/path -name 'cateory-icon' -exec sh -c 'mv "$1" "${1%/*}/category-icon-${1#cateory-icon-*}"' -- {} \;
展開${1#cateory-icon-*}
すると、 の後のファイル名が取得されますcateory-icon
。
答え2
zsh では、次の内容を入力します.zshrc
(または、1 回限りの場合はコマンド ラインでこれらを実行します)。
autoload zmv
alias zcp='zmv -C'
alias zln='zmv -L'
のzmv
関数zshと組み合わせるワイルドカードとグロブ機能簡単にファイルの名前を変更したりコピーしたりできます。必要な操作を実行するには、いくつかの方法があります。
zmv '(**/)cateory-icon-(*)' '${1}category-icons-$2'
zmv -w '**/cateory-icon-*' '${1}category-icons-$2'
zmv '**/cateory-icon-(*)' '$f:h/category-icons-$1'
いくつかの zsh 機能の説明:
**/
サブディレクトリ内のファイルを再帰的に一致します。- ソース式の括弧はグループを指定します。置換式の
$NUM
または は、${NUM}
NUM 番目のグループに含まれる元の名前の一部に置き換えられます。 - の周りの括弧
**
は少し変わっています。 の周りだけに置くことができ**/
、それ以上でもそれ以下でもいけません。 - オプション
-w
は、zmv
各ワイルドカードを自動的にグループに入れます ( の場合、末尾の が付いたグループ内の の部分**
です)。**/
/
$f
置換では、ソースファイル名全体を意味します。$VAR:h
は のディレクトリ部分を意味します$VAR
。これは通常、$VAR
最後の までです/
が、すべてのエッジケース (foo
、foo/
、/
、 …) が正しく処理されます。ベース名は として使用できます$VAR:t
。
答え3
移植性を最大限に高めるために Perl を使用する:
#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;
use File::Copy qw(move);
my $new_name;
finddepth( sub {
if(/cateory-icon/){
($new_name = $File::Find::name) =~ s{.*/\Kcateory-icon}{category-icons};
move $File::Find::name => $new_name;
}
},
'.')
説明
File::Find
これは、ディレクトリ ツリーの再帰的トラバーサルとFile::Copy
ディレクトリの再帰的コピー/移動の2 つの Perl コア モジュールを使用します。- 関数
finddepth
(fromFile::Find
) は、2 番目の引数として指定されたディレクトリのリスト (.
この場合は現在のディレクトリです。必要に応じて変更してください) を走査します。 - 最初の引数は、ツリーをたどる際に
finddepth
ファイルに遭遇するたびに実行されるサブルーチン参照です。finddepth
- このサブルーチンは条件によって開始されます
if
。一致したファイル名にパターンが含まれている場合はcateory-icon
、必要な修正を行って新しい名前を作成し、関数move
(fromFile::Copy
) を使用して現在の名前を新しい名前に変更します。
免責事項
このコードはテストされていません。まずはダミーのディレクトリ ツリーで試してください。