6

次のように、「rename」コマンドを使用して、不足している文字を現在のディレクトリ内のすべてのファイル名に追加できます。

echo "Renaming files..."
rename -v "s/^abcd124(.+)/abcd1234$1/" *.wav.gz;
echo "Done."

ただし、現在のディレクトリとそのすべてのサブディレクトリに対してこれを行いたいと思います。私はこれを試しました:

echo "Renaming files..."
for dir in $(find ./ -type d); do
    rename -v "s/^$dir\/abcd124(.+)/$dir\/abcd1234$1/" *.wav.gz;
done;
echo "Done."

ただし、$dir変数にこれらの特殊文字のいずれかが含まれている場合、{}[]()^$.|*+?\それらは \ で適切にエスケープされず、スクリプトが失敗します。

この問題を解決する最善の方法は何でしょうか? また、この問題を解決するために何を使用すると思いますawkか (利点/欠点?)

4

4 に答える 4

6

あなたも試すことができます:

find . -name "*.wav.gz" | xargs rename -v "s/abcd124*/abcd1234$1/"

「xargs」コマンドが利用可能な新しい Unix システムで動作します。正規表現を少し編集したことに注意してください。

于 2012-05-11T18:11:46.253 に答える
3

試す:

find ./ -type d -execdir rename -v "s/^abcd124(.+)/abcd1234\1/" *.wav.gz ";"

Find は既にファイルに対してイテレータを提供しています。よく見られるforaround it やbehindは必要ありません。xargsまあ - まれに、役に立つかもしれませんが、通常はそうではありません。

ここで、-execdir が役に立ちます。Gnu-find にはそれがあります。あなたの発見にもそれがあるかどうかはわかりません。

ただし、このコマンドを開始するディレクトリに *.wav.gz ファイルがないことを確認する必要があります。そうしないと、シェルがファイルを展開し、展開された名前を引き渡して名前を変更するためです。

注: rename から、正規表現で \1 を $1 に置き換える必要があるという警告が表示されますが、そうすると、パターンがキャッチされません。機能させるには \1 を使用する必要があります。

ここに別のアプローチがあります。wav.gz ファイルを検索する場合、なぜディレクトリを検索するのでしょうか?

find . -name "*.wav.gz" -exec rename -v "s/^abcd124(.+)/abcd1234\1/" {} ";"
于 2012-05-11T00:17:33.103 に答える
1

Gentoo Linux には名前変更ユーティリティが指定されていることに注意してください。

http://developer.berlios.de/project/showfiles.php?group_id=413

そのebuildによって

http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/sys-apps/rename/rename-1.3.ebuild?view=markup

Debian またはおそらく Ubuntu の場合、

renameis /usr/bin/prename、これは perl スクリプトです

移動前にご覧くださいrename --help

于 2012-05-13T16:49:55.350 に答える
1

4 bash:

shopt -s globstar
rename -v "s/^$dir\/abcd124(.+)/$dir\/abcd1234$1/" **/*.wav.gz;
于 2012-05-11T18:46:43.990 に答える