完全に自信があるわけではありませんが、mv
と(asrename
で)の違いは何ですか?正規表現を許可し、正規表現を許可しないことに加えて、どちらかの利点がありますか?私は同時に複数のファイル名を変更することも可能だと思いますが、そうしないでください。util-linux-ng 2.17.2
/usr/bin/rename
rename
mv
rename
mv
man
私は彼らのページで、または自分自身の調査を通して、他の何がそれらをユニークにするかについての明確な表示を見つけることができません。
答え1
どちらも基本的にふたに書かれた内容です。
mv
標準ユーティリティです到着移動する1 つ以上のファイルを指定された宛先に送信します。移動するファイルが1つしかない場合は、ファイルの名前を変更するために使用できます。複数のmv
場合、ターゲットがディレクトリの場合にのみ機能し、ファイルをそこに移動します。
したがって、mv foo bar
ファイルをfoo
ディレクトリに移動するかbar
(存在する場合)、名前を変更しますfoo
(bar
存在bar
しない場合、またはディレクトリではない場合)。mv foo1 foo2 bar
2つのファイルだけがそのディレクトリに移動され、ディレクトリでbar
はbar
ない場合は警告が発生します。
mv
ファイルを移動するためにCライブラリ関数が呼び出されrename()
、機能しない場合(別のファイルシステムに移動)、ファイルをコピーして元のファイルを削除します。
複数のファイルの名前を変更することがすべての場合は、mv
シェルループを使用する必要があります。ウェブサイトにこれに関する質問がたくさんあります。これ、これ、他の人。
一方、各種rename
公益事業名前を変更するファイルを個別に。
rename
ユーティリティLinuxから記載されている内容は、およびにrename foo bar *
変更するなどの単純な文字列置換を実行します。foobar
barbar
asdffoo
asdfbar
もちろんいいえただし、正規表現を使用してください!
Perlの名前変更ユーティリティ(またはそれに伴う様々なケース)はPerl式を使用してファイル名を変換します。次のコマンドを使用する可能性が最も高いです。s/pattern/replacement/
模様 はい正規表現。
util-linux の名前変更と Perl の名前変更はどちらも、ファイル名を適切に変更してファイルを別のディレクトリに同時に移動するために使用できますが、これは少し厄介です。両方ともrename()
ファイルを呼び出すので、あるファイルシステムから別のファイルシステムに移動することは機能しません。
rename
あなたが持っているものが何であるかについては、ディストリビューションによって異なる場合がありますおよび/またはあなたがインストールしたコンテンツ。ほとんどはサポートされているので、rename --version
それを使用して何を持っているかを確認してください。
答え2
mv
ファイル名を変更するだけです(他のファイルシステムまたはパスに移動することもできます)。古い名前と新しい名前を指定すると、ファイルは新しい名前または新しい場所に変更されます。
rename
バッチの命名を変更するために使用されます。
foo000.log
through 1000個のファイルがあり、それをthroughfoo999.log
に変更したいとします。bar000.log
bar999.log
これを行うmv
必要があります。そうでない場合はスクリプトを作成します。mv foo000.log bar000.log
mv foo001 bar001.log
rename
簡単にすると、織りrename foo bar foo*.log
、数千のファイルがすぐに変更されます!とても素敵です。
詳細については、このページをもう一度確認してくださいman rename
。
答え3
MV
これは、1つのことをうまく実行するように設計された基本的なコマンドラインです(Unix哲学)。ファイルまたはディレクトリの移動。
STDOUT
&¹ をハッキングしてターゲット文字列を動的に変更できますが、STDIN
これは単にスマートなハッカーではありません
名前変更(パール)
これを行うこともできないかもしれない同じ名前の他のツールがあるので注意してください。
人々が話すとき、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
これは基本命令ではありませんか?
名前を変更する実際にはデザインされていません。ディレクトリの移動しかし、次のようにすることができます。
$ 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.*
¹ ウェブサイトに表示されるコードの一部
for FILE in `ls *.txt`
do
mv ${FILE} `echo ${FILE} | sed 's/anything_ugly/anything_still_ugly/'`
done
この道ではありません。これは、適切な瞬間に適切なツールを使用する理由を説明するための明らかな間違いです。
答え4
MVファイルとディレクトリを移動するか、名前を変更してバックアップします。名前を変更するファイルの名前を変更するだけです。
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.