mvコマンドを使用して、あるディレクトリ内のすべてのファイルの名前を新しい名前に変更する方法。ディレクトリには1000個のファイルがあり、各ファイル名の最後の文字を特定の文字に変更する必要があります。例:一意の文字のみを変更するバッチリネーム
for i in *.txt; do
j=`echo $i |sed 's/.\.txt/_.txt/'`
mv $i $j
done
mvコマンドを使用して、あるディレクトリ内のすべてのファイルの名前を新しい名前に変更する方法。ディレクトリには1000個のファイルがあり、各ファイル名の最後の文字を特定の文字に変更する必要があります。例:一意の文字のみを変更するバッチリネーム
for i in *.txt; do
j=`echo $i |sed 's/.\.txt/_.txt/'`
mv $i $j
done
に変更する必要があります
abc.txt
asdf.txt
zxc.txt
...
ab_.txt
asd.txt
ですすべてが.txtの接尾辞を持っているので、私は以下のスクリプトを提案します:
for i in *.txt
do
r=`basename $i .txt | sed 's/.$//'`
mv $i ${r}_.txt
done
ファイル場合:ファイルが、それは私がこれは何千ものファイルで作業するかどうかわからないんだけど、bashで
ab_.txt
asd_.txt
zx_.txt
...
ab_.txt
as_.txt
あなたは、名前の衝突に注意する必要があるが、これは大丈夫動作するはずです:あなたはmv
のコメントを解除
for i in *.txt ; do
j=$(echo "$i" | sed 's/..txt$/_.txt/')
echo mv \"$i\" \"$j\"
#mv "$i" "$j"
done
後(私はあなたがそれが安全に何を見ることができるようにコメントし、それを左)。引用符はスペースでファイルを扱うためのものです(私の意見では悪い、悪いものです:-)。
あなたはthuslyのbashの${parameter%%word}
演算子を使用することができます。
for FILE in *.txt; do
mv $FILE ${FILE%%?.txt}_.txt
done
検索は、コマンドラインパラメータの長いリストにあなたの1000個のすべてのファイルを展開している、for file in *.txt
よりも効率的でなければなりません。例(bashの代替アプローチを使用するように更新):
find . \(-type d ! -name . -prune \) -o \(-name "*.txt" \) | while read file
do
mv $file ${file%%?.txt}_.txt
done
は、それはあなたがmv
コマンドを使用し、明確な要件ですか?
perl rename
のユーティリティはこの種のもののために書かれていた。これはDebianベースのLinuxディストリビューションの標準ですが、this pageによれば、他の誰にも簡単に追加できます。あなたが行うことができます
それは既に存在だ(またはあなたがそれをインストールする場合)場合:
rename -v 's/.\.txt$/_\.txt/' *.txt
それが必要だ場合は上記に含まページが正規表現、物事のいくつかの基本的な情報を持っています。
すべてのファイルは、「.TXT」で終わる場合は、そのために(複数の移動)をmmv
を使用することができます。
mmv "*[a-z].txt" "#1_.txt"
プラス:ABC:これはあなたの例では、衝突を(生成するときmmv
はあなたを教えてくれます。 txtは既に存在するab_.txtになります)の前にのファイル名が変更されました。
ファイル名を引用する必要があります。そうしないと、mmv
が表示される前にシェルがリストを展開します(ただし、通常mmv
もこの間違いをキャッチします)。
これは 'mv'自身ができることではありません。おそらくシェルスクリプトを使ってプログラムする必要があります。したがって、この問題を解決しようとしている* which *シェルを指定すると便利です。シェル間でスクリプトが異なるためです。 – unwind