2009-05-11 8 views
2

mvコマンドを使用して、あるディレクトリ内のすべてのファイルの名前を新しい名前に変更する方法。ディレクトリには1000個のファイルがあり、各ファイル名の最後の文字を特定の文字に変更する必要があります。例:一意の文字のみを変更するバッチリネーム

for i in *.txt; do 
    j=`echo $i |sed 's/.\.txt/_.txt/'` 
    mv $i $j 
done 
+1

これは 'mv'自身ができることではありません。おそらくシェルスクリプトを使ってプログラムする必要があります。したがって、この問題を解決しようとしている* which *シェルを指定すると便利です。シェル間でスクリプトが異なるためです。 – unwind

答えて

0

に変更する必要があります

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 
0

ファイル場合:ファイルが、それは私がこれは何千ものファイルで作業するかどうかわからないんだけど、bashで

ab_.txt 
asd_.txt 
zx_.txt 
... 
ab_.txt 
as_.txt 
+0

これは、ピリオドの前の文字をアンダースコアで置き換えるようには見えません。 – unwind

+0

私は実際にbasenameがそれを行うことができた(教育のおかげで)ことを知りませんでしたが、解決策に欠陥があります。最後の文字を置き換えるのではなく、アンダースコアを追加します。 – paxdiablo

+0

はい、そうです。私は意図的にbasenameを維持して編集します。 – mouviciel

2

あなたは、名前の衝突に注意する必要があるが、これは大丈夫動作するはずです:あなたはmvのコメントを解除

for i in *.txt ; do 
    j=$(echo "$i" | sed 's/..txt$/_.txt/') 
    echo mv \"$i\" \"$j\" 
    #mv "$i" "$j" 
done 

後(私はあなたがそれが安全に何を見ることができるようにコメントし、それを左)。引用符はスペースでファイルを扱うためのものです(私の意見では悪い、悪いものです:-)。

0

あなたはthuslyのbashの${parameter%%word}演算子を使用することができます。

for FILE in *.txt; do 
    mv $FILE ${FILE%%?.txt}_.txt 
done 
1

検索は、コマンドラインパラメータの長いリストにあなたの1000個のすべてのファイルを展開している、for file in *.txtよりも効率的でなければなりません。例(bashの代替アプローチを使用するように更新):

find . \(-type d ! -name . -prune \) -o \(-name "*.txt" \) | while read file 
do 
    mv $file ${file%%?.txt}_.txt 
done 
1

は、それはあなたがmvコマンドを使用し、明確な要件ですか?
perl renameのユーティリティはこの種のもののために書かれていた。これはDebianベースのLinuxディストリビューションの標準ですが、this pageによれば、他の誰にも簡単に追加できます。あなたが行うことができます

それは既に存在だ(またはあなたがそれをインストールする場合)場合:

rename -v 's/.\.txt$/_\.txt/' *.txt 

それが必要だ場合は上記に含まページが正規表現、物事のいくつかの基本的な情報を持っています。

2

すべてのファイルは、「.TXT」で終わる場合は、そのために(複数の移動)をmmvを使用することができます。

mmv "*[a-z].txt" "#1_.txt" 

プラス:ABC:これはあなたの例では、衝突を(生成するときmmvはあなたを教えてくれます。 txtは既に存在するab_.txtになります)の前にのファイル名が変更されました。

ファイル名を引用する必要があります。そうしないと、mmvが表示される前にシェルがリストを展開します(ただし、通常mmvもこの間違いをキャッチします)。

関連する問題