私には完全に明確ではありませんが、mv
とrename
(util-linux-ng 2.17.2
を/usr/bin/rename
として)の違いは何ですか?正規表現を受け入れるrename
を超えて他の利点よりも優れている点はありますか?mv
は受け入れませんか? rename
は一度に複数のファイルの名前変更も処理できると思いますが、mv
はこれを行いません。
私は彼らのman
ページで、他に何がそれらを際立たせているのか、または私自身のいくつかの調査を通じて明確な兆候を見つけることができませんでした。
どちらの場合も、基本的にはふたに書かれています。
mv
は標準ユーティリティ からmove1つまたは複数のファイルを特定のターゲットに移動します。移動するファイルが1つしかない場合は、ファイルの名前を変更するために使用できます。複数ある場合、mv
は、ターゲットがディレクトリの場合にのみ機能し、そこにファイルを移動します。
したがって、_mv foo bar
_は、ファイルfoo
をディレクトリbar
(存在する場合)に移動するか、foo
をbar
に名前変更します(bar
は存在しないか、ディレクトリではありません)。 _mv foo1 foo2 bar
_は、両方のファイルをディレクトリbar
に移動するか、bar
がディレクトリでない場合はメッセージを表示します。
mv
はrename()
Cライブラリ関数を呼び出してファイルを移動し、それが機能しない場合(ファイルが別のファイルシステムに移動されている場合)はファイルをコピーして削除しますオリジナル。
mv
しかなく、複数のファイルの名前を変更する場合は、シェルループを使用する必要があります。このサイトには、多くの質問があります。 this 、 this 、 およびその他 。
一方、さまざまなrename
ユーティリティrenameファイルは個別に。
til-linuxのrename
を使用すると、単純な文字列置換が行われます。 _rename foo bar *
_は、foobar
をbarbar
に、asdffoo
をasdfbar
に変更します。 それはではありませんが、正規表現を取ります!
Perl名前変更ユーティリティ ( またはそのさまざまなインスタンス )は、Perl式を使用してファイル名を変換します。おそらく_s/pattern/replacement/
_コマンドを使用します。ここで、パターンは正規表現です 。
Util-linux renameとPerl renameの両方を使用して、ファイル名に適切な変更を加えることで、ファイルを同時に別のディレクトリに移動できますが、少し厄介です。また、ファイルに対してrename()
を呼び出すだけなので、ファイルシステム間での移動は機能しません。
あなたが持っているrename
については あなたのディストリビューションに依存するかもしれません 、そして/またはあなたがインストールしたもの。それらのほとんどは_rename --version
_をサポートしているので、それを使用してどちらを持っているかを識別します。
これは、1つのことをうまく行うために設計された基本的なコマンドラインです(Unixの哲学):move file(s)or directorie(s)。
STDOUT
&STDIN
¹をハックして、目的の文字列をその場で変更できますが、それは単なるスマートハックではありません
同じ名前でこれを実行できる場合とできない場合がある他のツールがあるので、注意してください。
人々が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サイトに表示されるコード
_for FILE in `ls *.txt`
do
mv ${FILE} `echo ${FILE} | sed 's/anything_ugly/anything_still_ugly/'`
done
_
それは行く方法ではありません、それは明白なバグです、ちょうど適切なタイミングで適切なツールを使用する理由を説明するためです
mv
は、ファイルの名前を変更するだけです(別のファイルシステムまたはパスに移動することもできます)。古い名前と新しい名前を付けると、ファイルが新しい名前または場所に変更されます。 rename
は、名前の一括変更に使用されます。たとえば、foo000.log
からfoo999.log
までの1,000個のファイルがあり、それらをbar000.log
からbar999.log
に変更したいとします。 mv
を使用すると、mv foo000.log bar000.log
、mv foo001 bar001.log
などを実行するか、スクリプトを作成する必要があります。 rename
を使用すると、rename foo bar foo*.log
を実行するだけで、1,000個のファイルが瞬時に変更されます。かなりクール。詳細については、man rename
ページをもう一度確認してください。