パターンと置換リストを使用してファイル名を繰り返し変更します。

パターンと置換リストを使用してファイル名を繰り返し変更します。

次のファイル構造があります。

  • いくつかのディレクトリ
    • 一部のファイル.txt
    • ここに別のファイルがあります。 .log
    • .mp3 ファイルもあります。
  • その他のディレクトリ
    • 他のfile.txtと一緒に
  • ルートレベル file.txt
  • ルートレベルの他のファイル.ext

今私が望むのは、パターン/代替ペアを含む別のファイルを入力として使用して、そのファイルに基づいてそのファイルの名前を繰り返し変更する小さなスクリプトを実行することです。これにより、すべての「another」(大文字と小文字を区別しない)が「foo」に置き換えられるか、すべての「some」が「bar」に置き換えられます。

私はファイルを繰り返してその入力ファイルを読み取るためにいくつかの方法を試しましたが、何も機能せず、最終的に誤ってテストスクリプトを上書きしました。しかしls、、、whilesed多くmv使われています。

自分で知らない2つは、ファイル名のスペースを処理する方法と、以前のパターンマッチングで名前が変更されたファイルを処理しない方法です。

たぶんあなたが私に正しい方向を伝えることができますか?

ベストアンサー1

TOP="`pwd -P`" \
find . -type d -exec sh -c '
   for d
   do
      cd "$d" && \
         find . ! -name . -prune -type f -exec sh -c '\''
            while IFS=\; read -r pat repl
            do
               rename "s/$pat/$repl/g" "$@"
               N=$#
               for unmoved
               do
                  if [ -f "$unmoved" ]
                  then
                     set X ${1+"$@"} "$unmoved"
                     shift
                  fi
               done
               shift "$N"
               case $# in 0 ) break ;; esac
            done < patterns.csv
         '\'' x \{\} +
      cd "$TOP"
   done
' x {} +
  • findネットワークディレクトリを設定して飲み込むだけですsh。これにより、呼び出し回数が最小限に抑えられますsh
  • find各ディレクトリのネットワークファイルをregular奥行きレベル1に設定し、shおしゃべりをしてください。これにより、renameユーティリティの呼び出し回数が最小限に抑えられます。
  • while個々のペアで読み取り、pattern <-> replacementすべてのファイルに適用するようにループを設定しますregular
  • 進行中rename-イギリスrename処理後もファイルがまだ存在するかどうかを記録します。ファイルがまだ存在するということは、何らかの理由で名前を変更することはできず、次の反復で試行されることを意味しますpat/repl。 OTOH、ファイル名が正常に変更された場合は、pat/replコマンドライン引数リストからファイルを削除して、ファイルに次の反復を適用しません。

おすすめ記事