1

複数のファイルの名前を変更したいのですが、ファイルの最後または最初に文字列を追加するだけではありません。特定の場所に置きたいのですが。これは私が現在使用しているコマンドですが、ファイル名の最初と最後にのみ追加できます。

for f in `ls  ~/tmp/*`; do FILE=`basename $f`; echo "Rename:"$f;echo $FILE; mv "$f" "/home/tmp/JC_"${FILE%.*}"_hg19."${FILE#*.}"";  done

ファイル名が次のようになっhell_1.txtているとしましょう(簡単にするために、それぞれ異なる番号のファイルがたくさんあるとしましょう)oファイル名にを追加したいので、結果の名前がhello_1.txtあればいいでしょうこの例だけでなく、一般的な解決策。

4

3 に答える 3

2

これは機能するはずです:

for x in ~/tmp/*.txt; do mv $x `echo $x | sed -e 's#hell#hello#'`; done
于 2013-03-27T11:20:14.930 に答える
0

どうですか

rename 's/hell_/hello_/' /tmp/*.txt
于 2013-03-27T11:32:22.267 に答える
0

「hell。*_NNN.txt」を「hel。*o_NNN.txt」に変更したいことがわかった場合(。*を「hell」と「_NNN.txt」の間に保持します(NNNは任意の数)。

それから:

for x in ~/tmp/*.txt; do 
   mv "$x" "$(echo "$x" | LC_COLLATE=C sed -e 's#\(hell.*\)\(_[0-9]*\.txt$\)#\1o\2#')"
done

sedの呼び出し中にLC_COLLATE=Cを追加したので、数字「0」または「1」または...または「9」のみに一致する「[0-9]」に依存できます。

(LC_COLLATEを追加する理由がわからない場合:一部のロケール[A-Z]では、すべての文字AZまたはay('z'を除く!)に一致する可能性があります。このようなロケールでは、文字は次の順序で表示されます:'A''a''B''b'.. 。'Z''z'。そして他のロケールでは、誰が知っていますか?)

(注:「[0-9] 」を「[[:digit:]]」表記に置き換えることもできますが、移植性が低くなる可能性があります。「古い」バージョンのsedはこの表記を認識せず、試行します。 '['または':'または...または't'または':'のいずれかに一致し、その後に']'が続く(*、したがって0,1回以上)...そのため、私はしませんこれらの特別な[[:things:]]をsed、trなどで使用するようなものです。移植性が低いと思います。これらを使用したい場合は、代わりにperlを使用してください。)

于 2013-03-27T13:23:43.417 に答える