次のファイル構造があります。
- いくつかのディレクトリ
- 一部のファイル.txt
- ここに別のファイルがあります。 .log
- .mp3 ファイルもあります。
- その他のディレクトリ
- 他のfile.txtと一緒に
- ルートレベル file.txt
- ルートレベルの他のファイル.ext
今私が望むのは、パターン/代替ペアを含む別のファイルを入力として使用して、そのファイルに基づいてそのファイルの名前を繰り返し変更する小さなスクリプトを実行することです。これにより、すべての「another」(大文字と小文字を区別しない)が「foo」に置き換えられるか、すべての「some」が「bar」に置き換えられます。
私はファイルを繰り返してその入力ファイルを読み取るためにいくつかの方法を試しましたが、何も機能せず、最終的に誤ってテストスクリプトを上書きしました。しかしls
、、、while
がsed
多く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
コマンドライン引数リストからファイルを削除して、ファイルに次の反復を適用しません。