web-dev-qa-db-ja.com

「名前の変更」と「mv」の違いは何ですか?

私には完全に明確ではありませんが、mvrenameutil-linux-ng 2.17.2/usr/bin/renameとして)の違いは何ですか?正規表現を受け入れるrenameを超えて他の利点よりも優れている点はありますか?mvは受け入れませんか? renameは一度に複数のファイルの名前変更も処理できると思いますが、mvはこれを行いません。

私は彼らのmanページで、他に何がそれらを際立たせているのか、または私自身のいくつかの調査を通じて明確な兆候を見つけることができませんでした。

12
Urda

どちらの場合も、基本的にはふたに書かれています。

mvは標準ユーティリティ からmove1つまたは複数のファイルを特定のターゲットに移動します。移動するファイルが1つしかない場合は、ファイルの名前を変更するために使用できます。複数ある場合、mvは、ターゲットがディレクトリの場合にのみ機能し、そこにファイルを移動します。

したがって、_mv foo bar_は、ファイルfooをディレクトリbar(存在する場合)に移動するか、foobarに名前変更します(barは存在しないか、ディレクトリではありません)。 _mv foo1 foo2 bar_は、両方のファイルをディレクトリbarに移動するか、barがディレクトリでない場合はメッセージを表示します。

mvrename() Cライブラリ関数を呼び出してファイルを移動し、それが機能しない場合(ファイルが別のファイルシステムに移動されている場合)はファイルをコピーして削除しますオリジナル。

mvしかなく、複数のファイルの名前を変更する場合は、シェルループを使用する必要があります。このサイトには、多くの質問があります。 thisthisおよびその他


一方、さまざまなrenameユーティリティrenameファイルは個別に。

til-linuxのrename を使用すると、単純な文字列置換が行われます。 _rename foo bar *_は、foobarbarbarに、asdffooasdfbarに変更します。 それはではありませんが、正規表現を取ります!

Perl名前変更ユーティリティまたはそのさまざまなインスタンス )は、Perl式を使用してファイル名を変換します。おそらく_s/pattern/replacement/_コマンドを使用します。ここで、パターンは正規表現です

Util-linux renameとPerl renameの両方を使用して、ファイル名に適切な変更を加えることで、ファイルを同時に別のディレクトリに移動できますが、少し厄介です。また、ファイルに対してrename()を呼び出すだけなので、ファイルシステム間での移動は機能しません。

あなたが持っているrenameについては あなたのディストリビューションに依存するかもしれません 、そして/またはあなたがインストールしたもの。それらのほとんどは_rename --version_をサポートしているので、それを使用してどちらを持っているかを識別します。

21
ilkkachu

mv

これは、1つのことをうまく行うために設計された基本的なコマンドラインです(Unixの哲学):move file(s)or directorie(s)

STDOUTSTDIN¹をハックして、目的の文字列をその場で変更できますが、それは単なるスマートハックではありません

名前の変更(Perlのもの)

warning 同じ名前でこれを実行できる場合とできない場合がある他のツールがあるので、注意してください。

人々がrenameについて話すとき、私たちはこれについて考えます。ELFではなく、それほど強力ではありません(魔法?)。

これは基本的なものではなく、Perlです。内部でいくつかのPerlの関数を渡すことができ、それは非常に強力です。

この例を考えてみましょう:

あなたは名前を変更したいのようなファイルの束

_foobar_1.txt
foobar_2.txt
foobar_3.txt
_

次のようにsprintf()を使用して、数字の前にゼロを付加できます(正規表現を使用して、heh、それはPerl:Dです):

_rename 's/(\d+)/sprintf("%04d", $1)/e' foobar_*.txt
_

今あなたは持っています:

_foobar_0001.txt
foobar_0002.txt
foobar_0003.txt
_

本当に基本的なコマンドではありませんか?

rename は実際にはdir(s)を移動するように設計されていませんが、それはそれを行うことができます:

_$ mkdir -p /tmp/foo/bar/base
$ touch /tmp/foo/bar/base/file
$ rename 's!/tmp/foo/bar/base/file!/tmp/file!' /tmp/foo/bar/base/file
_

移動したファイル

_/tmp/file
_

__ _*.stackexchange.*_のWebサイトに表示されるコード

enter image description here

_for FILE in `ls *.txt`
do
    mv ${FILE} `echo ${FILE} | sed 's/anything_ugly/anything_still_ugly/'`
done
_

それは行く方法ではありません、それは明白なバグです、ちょうど適切なタイミングで適切なツールを使用する理由を説明するためです

2
Gilles Quenot

mvは、ファイルの名前を変更するだけです(別のファイルシステムまたはパスに移動することもできます)。古い名前と新しい名前を付けると、ファイルが新しい名前または場所に変更されます。 renameは、名前の一括変更に使用されます。たとえば、foo000.logからfoo999.logまでの1,000個のファイルがあり、それらをbar000.logからbar999.logに変更したいとします。 mvを使用すると、mv foo000.log bar000.logmv foo001 bar001.logなどを実行するか、スクリプトを作成する必要があります。 renameを使用すると、rename foo bar foo*.logを実行するだけで、1,000個のファイルが瞬時に変更されます。かなりクール。詳細については、man renameページをもう一度確認してください。

2
eewanco