102

次のようなファイルがたくさんあります。

DET01-ABC-5_50-001.dat
...
DET01-ABC-5_50-0025.dat

そして、私はそれらを次のようにしたい:

DET01-XYZ-5_50-001.dat
...
DET01-XYZ-5_50-0025.dat

これどうやってするの?

4

6 に答える 6

185

名前変更コマンドにはいくつかのバリエーションがありますが、あなたの場合、それは次のように単純かもしれません。

rename ABC XYZ *.dat

Perl正規表現を使用するバージョンがある場合があります。

rename 's/ABC/XYZ/' *.dat
于 2009-09-08T08:56:56.227 に答える
9

このような何かがそれを行います。forキャプチャするファイル名によっては、ループを変更する必要がある場合があります。

for fspec1 in DET01-ABC-5_50-*.dat ; do
    fspec2=$(echo ${fspec1} | sed 's/-ABC-/-XYZ-/')
    mv ${fspec1} ${fspec2}
done

ちなみに、これらのスクリプトは、データのコピーで、まったく異なるディレクトリで常にテストする必要があります。

于 2009-09-08T08:57:33.027 に答える
4

sed http://unixhelp.ed.ac.uk/CGI/man-cgi?sedの使用方法を学ぶ必要があります。

また、 for を使用して、ファイルエントリをループできるようにしますhttp://www.cyberciti.biz/faq/bash-for-loop/

あなたのコマンドは次のようになります。私のそばに用語がないので、確認できません

for i in `dir` do mv $i `echo $i | sed '/orig/new/g'`
于 2009-09-08T08:47:50.693 に答える
1

これらの答えはすべて単純で良いものです。ただし、誤検知を見つけることができるように、これらのスクリプトにインタラクティブモードを追加するのが常に好きです。

if [[ -n $inInteractiveMode ]]
then
    echo -e -n "$oldFileName => $newFileName\nDo you want to do this change? [Y/n]: "
    read run

    [[ -z $run || "$run" == "y" || "$run" == "Y" ]] && mv "$oldFileName" "$newFileName"
fi

または、インタラクティブモードをデフォルトにして、自動スクリプト用に、または大胆に感じている場合は、強制フラグ(-f | --force)を追加します。そして、これはあなたをそれほど遅くしません:デフォルトの応答は「はい、私は名前を変更したいです」なので、各プロンプトでエンターキーを押すだけです(-z $runテストのため)。

于 2009-09-09T05:15:23.887 に答える
1

私はsedでこれを行うのが好きです。あなたの場合:

for x in DET01-*.dat; do
    echo $x | sed -r 's/DET01-ABC-(.+)\.dat/mv -v "\0" "DET01-XYZ-\1.dat"/'
done | sh -e

何が実行されるかを確認するには、最初に「sh-e」の部分を省略するのが最善です。

于 2009-09-08T08:54:46.210 に答える