OSX で複数のファイル、サブディレクトリの名前を変更し、特定の場所に文字を挿入する

OSX で複数のファイル、サブディレクトリの名前を変更し、特定の場所に文字を挿入する

で始まるファイルとディレクトリがあります「カテゴリアイコン」多くのサブディレクトリにあります。再帰的に名前を変更しようとしています「カテゴリアイコン」不足している部分を追加しました「グ」カテゴリーそして「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最後の までです/が、すべてのエッジケース ( foofoo//、 …) が正しく処理されます。ベース名は として使用できます$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(from File::Find) は、2 番目の引数として指定されたディレクトリのリスト (.この場合は現在のディレクトリです。必要に応じて変更してください) を走査します。
  • 最初の引数は、ツリーをたどる際にfinddepthファイルに遭遇するたびに実行されるサブルーチン参照です。finddepth
  • このサブルーチンは条件によって開始されますif。一致したファイル名にパターンが含まれている場合はcateory-icon、必要な修正を行って新しい名前を作成し、関数move(from File::Copy) を使用して現在の名前を新しい名前に変更します。

免責事項

このコードはテストされていません。まずはダミーのディレクトリ ツリーで試してください。

関連情報