名前の最初の部分を同じに保ちながら、ディレクトリ内のすべてのファイルの名前を変更します。

名前の最初の部分を同じに保ちながら、ディレクトリ内のすべてのファイルの名前を変更します。

ファイルでいっぱいのディレクトリがあります。 *.pyに一致するすべてのファイルの名前を-backup.pyに変更したいと思います。どうすればいいですか?

私は*.pyでiを使うことができることを知っていますが、最初の名前を維持し、すべての名前にバックアップを追加する方法がわかりません。

答え1

for i in *.py
do
    mv "$i" `echo "$i" | sed 's/\.py$/-backup.py/'`
done

答え2

邪悪なスープと同じfind

find . -name '*.py' -exec bash -c 'mv "$1" "${1%.py}-backup.py"' _ {} \;

またはインスタンスを起動したくない場合見つかったファイルごとに、次の操作を行います。

find . -name '*.py' -exec bash -c 'for f; do mv "$f" "${f%.py}-backup.py"; done' _ {} +

findファイルが多い場合、このソリューションはより良い可能性があります。ワイルドカードは遅いです。-nオプションmv(スポイラーなし)または-vオプション(詳細)を自由に追加してください。

答え3

本質はunxnutの答えと同じですが、sedを使って拡張機能を削除するのと同じくらい簡単なことをするのは過剰だと思います。

for f in ./*.py; do mv "$f" "${f%.py}-backup.py"; done

${f%.py}変数$ fは.py最後から削除されました。削除を使用して最初から始めることもできます${f#whatever}。再帰性のために(つまり、現在のディレクトリとすべてのサブディレクトリで作業する)bash 4+があると仮定すると、globstarを使用できます。

shopt -s globstar
for f in ./**/*.py; do mv "$f" "${f%.py}-backup.py"; done

または、名前の変更を使用できます。実際、この名前を使用する2つの異なるプログラムがあり、どのプログラムを使用するかは* nixのバージョンによって異なります。 perl-rename(DebianやUbuntuなどの派生製品で使用):

rename 's/\.py$/-rename.py/' ./*.py

別の名前変更は、次の構文を使用します。

rename .py -backup.py ./*.py

forもちろん、ループはmv移植性が優れています。最初の非再帰ループはPOSIXなので、一部の博物館資料を除くすべての* nixで動作します。

関連情報