ファイルでいっぱいのディレクトリがあります。 *.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で動作します。