「rename」と「mv」の違いは何ですか?


12

それは私には完全に明確ではありませんが、違いは何であるmvrename(からutil-linux-ng 2.17.2などの/usr/bin/rename)?rename正規表現を受け入れること以外の利点mvはありますか?rename複数のファイル名の変更も一度に処理できると思いますが、これmvはできません。

man他の人が他の人と区別していることや、私自身の調査を通じて、彼らのページに明確な指示を見つけることができませんでした。


2
同じことを話し合っていることを確認しましょう。以下からの出力何type -a renameとはrename --version
ジェフシャラー

@JeffSchallerそれのより多くの好奇心の私の部分で、私の* nixのマシンのいずれかに私が取得rename is /usr/bin/renameし、rename (util-linux-ng 2.17.2)それぞれ。
ウルダ

6
そこにはいくつかの異なる名前の変更があり、エイリアス/関数/スクリプトである可能性があったので、それが何であるかを確認したかっただけです。ありがとうございました!これらの出力を自由に編集してご質問ください。
ジェフシャラー

@JeffSchallerは心配いりません。実際、このリンクは、私renameが見つけたもので、異なるディストリビューションで異なることを意味していることを示しています。
ウルダ

5
あなたの質問には答えが含まれているようです。「ジェットと三輪車の違いは何ですか。ジェットは飛ぶことができ、数千倍速く進むことができるという事実以外に?」:-)⁠
G-マンは「元に戻すモニカ言う

回答:


21

それは基本的に、ふたに書かれていることの両方です。

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

そのmv foo barため、ファイルfooをディレクトリに移動するbar(存在する場合)か、名前fooを変更しますbarbar存在しないか、ディレクトリでない場合)。mv foo1 foo2 barは両方のファイルをdirectoryに移動するbarbar、がディレクトリでない場合は文句を言うだけです。

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

必要なものがすべてありmv、複数のファイルの名前を変更する場合は、シェルループを使用する必要があります。このサイトには、これに関する多くの質問があります。たとえば、thisthisおよび他を参照してください。


一方、さまざまなrenameユーティリティはファイルの名前を個別に変更します。

renameutilの-Linuxからのあなたは、単純な文字列置換を行い、例えば言及rename foo bar *変化するであろうfoobarbarbar、とasdffooしますasdfbarただし、正規表現は使用できませ

Perl名前変更ユーティリティまたはそのさまざまなインスタンス)は、Perl式を使用してファイル名を変換します。パターン正規表現であるコマンドを使用する可能性が最も高いでしょう。s/pattern/replacement/

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

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


「正規表現」だけでなく、必要に応じて機能
Gilles Quenot

@GillesQuenot、ええと、ええ、あなたはrename '$_=lc' *小文字のファイル名などにできます。しかし、最も一般的なケースは使用することだと思いますs///(これについては前述しました)。そのパターン部分は正規表現です。そこでは関数を使用できないと思います。ただし、交換部品でそれを行うことができます。
ilkkachu

@ MyWrathAcademia、manページの最初の例は私に有効です(他の例とは動作が異なります)。また、私がDebianのマンページにリンクした理由は、少なくとも、manページrename.ulがutil-linuxバージョン用であり、他のものではないことを非常に明確にし ているからです。
-ilkkachu

@ilkkachu、最初の例に回答またはコメントで説明を追加してもよろしいですか。例とは異なるman renameため、debianの例
-MyWrathAcademia

@MyWrathAcademia、rename foo foo0 foo?; rename foo foo0 foo??それは私が見た2つのmanページの唯一の違いだったので、あなたは例を意味していると思いました。最初のコマンドは各1桁のファイル名にゼロを追加し、その後、2番目のコマンドは2桁のファイル名に(もう1つの)ゼロを追加するため、このコマンドペアは機能します。その2番目のセットには、最初のコマンドによって名前が変更されたファイルが含まれます。rename foo foo00 foo?最初のコマンドとしても使用できますが、一度に2つのゼロを追加するだけです。
-ilkkachu

2

mvファイルの名前を変更するだけです(別のファイルシステムまたはパスに移動することもできます)。古い名前と新しい名前を付けて、ファイルを新しい名前または場所に変更します。rename一括命名の変更に使用されます。あなたは、数千のファイルを持っていたと言っfoo000.logfoo999.log、あなたがそれらを変更したいbar000.logbar999.log。ではmv、、などを実行するかmv foo000.log bar000.logmv foo001 bar001.logスクリプトを作成する必要があります。ではrenameあなたは、単に行うrename foo bar foo*.log、と出来上がり、数千のファイルを瞬時に変更されます!かなりクール。man rename詳細については、もう一度ページをご覧ください。


2

mv

これは、1つのことをうまく実行できるように設計された基本的なコマンドラインです(UNIXの哲学)。ファイルを移動するか、ディレクトリを移動します

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

名前の変更(Perlのもの)

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

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

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

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

次のようなファイルの名前変更したい

foobar_1.txt
foobar_2.txt
foobar_3.txt

次のsprintf()ように数字の前にゼロを付けることができます(正規表現を使用して、へっ、Perl:Dです):

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

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

foobar_0001.txt
foobar_0002.txt
foobar_0003.txt

本当に基本的なコマンドではありませんよね。

は実際には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

website *.stackexchange.*ウェブサイトに表示されるコード

ここに画像の説明を入力してください

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

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


sprintf名前を変更してingするための+1
Archemar '

-1

mvはファイルとディレクトリを移動または名前変更し、それらをバックアップします。renameはファイルの名前を変更するだけです。

mvには、より多くの機能とオプションがあります。それぞれのマニュアルページのスイッチを見て、機能の違いを確認してください。を使って見てみましょうUbuntu 18.04LTSで(マイレージは各パッケージのバージョンによって異なる場合があります):

mvオプション(ヘルプとバージョンは省略)

   --backup[=CONTROL]  
          make a backup of each existing destination file  

   -b     like --backup but does not accept an argument  

   -f, --force  
          do not prompt before overwriting  

   -i, --interactive  
          prompt before overwrite  

   -n, --no-clobber  
          do not overwrite an existing file  

  If you specify more than one of -i, -f, -n, only the final one takes effect.  

   --strip-trailing-slashes  
          remove any trailing slashes from each SOURCE argument  

   -S, --suffix=SUFFIX  
          override the usual backup suffix  

   -t, --target-directory=DIRECTORY  
          move all SOURCE arguments into DIRECTORY  

   -T, --no-target-directory  
          treat DEST as a normal file  

   -u, --update  
          move only when the SOURCE file is newer than the destination file or when the destination file is missing  

   -v, --verbose  
          explain what is being done  

   -Z, --context  
          set SELinux security context of destination file to default type  

名前変更オプション(ヘルプとバージョンは省略)

   -s, --symlink   
          Do not rename a symlink but its target.  

   -v, --verbose  
          Show which files where renamed, if any.  

   -n, --no-act  
          Do not make any changes.  

   -o, --no-overwrite  
          Do not overwrite existing files.            

3
「より強力」を定義します。mvはrenameのような正規表現をサポートしていますか?
Gilles Quenot

質問者が述べたように、いいえ。
K7AAY

2
なんという議論でしょう
Gilles Quenot

1
クレジットの期日までにクレジットを与える。
K7AAY
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.