web-dev-qa-db-ja.com

ファイル名の一部の名前を変更する

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

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

そして、私は彼らがこのように見えることを望みます:

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

これどうやってするの?

81
not_a_geek

名前変更コマンドにはいくつかのバリエーションがありますが、あなたの場合は、

rename ABC XYZ *.dat

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

rename 's/ABC/XYZ/' *.dat
154
Paul Dixon
for file in *.dat ; do mv $file ${file//ABC/XYZ} ; done

renameまたはsedは不要です。ただbash パラメータ展開

101
RJ Alten

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

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

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

7
paxdiablo

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

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

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

for i in `dir` do mv $i `echo $i | sed '/orig/new/g'`
4
Stephen Lacy

これらの答えはすべてシンプルで良いものです。ただし、これらのスクリプトにインタラクティブモードを追加して、誤検出を検出できるようにしています。

if [[-n $ inInteractiveMode]]
それから
echo -e -n "$ oldFileName => $ newFileName\nこの変更を行いますか?[Y/n]:"
実行を読む

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

または、インタラクティブモードをデフォルトにして、自動化されたスクリプトまたは大胆な気分を味わう場合は、強制フラグ(-f | --force)を追加します。そして、これはあなたをあまり遅くしません:デフォルトの応答は「はい、私は名前を変更したいです」ので、あなたはただ各プロンプトでエンターキーを押すことができます(「-z $ run\テスト。

1
Sam Bisbee

私は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」の部分を省略するのが最善です。

1
stribika