ファイルの名前を変更して拡張子を変更し、効果的に達成したい
mv *.txt *.tsv
しかし、これを行うとき、私は得る:
* .tsvはディレクトリではありません
最初の10回のGoogleヒットショーmv
がこのように機能するのは少し奇妙です。
ファイルの名前を変更して拡張子を変更し、効果的に達成したい
mv *.txt *.tsv
しかし、これを行うとき、私は得る:
* .tsvはディレクトリではありません
最初の10回のGoogleヒットショーmv
がこのように機能するのは少し奇妙です。
回答:
コマンドを発行するとき:
mv *.txt *.tsv
シェルは、bashを想定して、一致するファイル(ディレクトリを含む)があればワイルドカードを展開します。ファイルのリストは、ここでプログラムに渡されます。一致するものが見つからない場合、展開されていないバージョンが渡されます。mv
繰り返しますが、シェルはプログラムではなくパターンを展開します。
たくさんの例がおそらく最良の方法なので、ここに行きます:
$ ls
file1.txt file2.txt
$ mv *.txt *.tsv
mv
行で何が起こるかは、シェル*.txt
が一致するファイルに展開することです。*.tsv
変更されていないファイルがないため。
mv
コマンドが呼び出された二つの特別な引数を持ちます:
argc
:プログラムを含む引数の数。argv
:最初のエントリとしてプログラムを含む引数の配列。上記の例では:
argc = 4
argv[0] = mv
argv[1] = file1.txt
argv[2] = file2.txt
argv[3] = *.tsv
mv
最後の引数は、かどうかを確認するためにプログラムチェック*.tsv
、ディレクトリです。そうではないため、ファイルを連結するように設計されていないため、プログラムは続行できません。(通常、すべてのファイルを1つに移動します。)気まぐれにディレクトリを作成することもできません。
結果として、異常終了し、エラーを報告します。
mv: target ‘*.tsv’ is not a directory
代わりに言うなら:
$ mv *1.txt *.tsv
mv
コマンドがで実行されます。
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[2] = *.tsv
もう一度、存在するmv
かどうかを確認します*.tsv
。ファイルfile1.txt
はに移動されないため*.tsv
。つまり、ファイル名が*.tsv
アスタリスクとすべてに変更されます。
$ mv *1.txt *.tsv
‘file1.txt’ -> ‘*.tsv’
$ ls
file2.txt *.tsv
代わりに言った場合:
$ mkdir *.tsv
$ mv *.txt *.tsv
mv
コマンドがで実行されます。
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[1] = file2.txt
argv[2] = *.tsv
*.tsv
今そこに移動されるまでのファイルが終了すると、ディレクトリです。
現在:some_command *.tsv
ワイルドカードを実際に保持することを意図している場合など、常に引用符で囲む必要があるコマンドを使用します。引用符を付けることにより、一致する必要がある場合にワイルドカードが展開されるのを防ぎます。例えば、言いますmkdir "*.tsv"
。
展開は、たとえば次の場合にさらに表示できます。
$ ls
file1.txt file2.txt
$ mkdir *.txt
mkdir: cannot create directory ‘file1.txt’: File exists
mkdir: cannot create directory ‘file2.txt’: File exists
現在:このmv
コマンドは、複数のファイルで機能します。ただし、2つ以上ある場合は、最後のディレクトリをターゲットディレクトリにする必要があります。(-t TARGET_DIR
オプションで、少なくともGNU mvではこのオプションを使用できます。)
だからこれはOKです:
$ ls -F
b1.tsv b2.tsv f1.txt f2.txt f3.txt foo/
$ mv *.txt *.tsv foo
ここmv
で呼び出されます:
argc = 7
argv[0] = mv
argv[1] = b1.tsv
argv[2] = b2.tsv
argv[3] = f1.txt
argv[4] = f2.txt
argv[5] = f3.txt
argv[6] = foo
そして、すべてのファイルがディレクトリに配置されますfoo
。
リンクについて。あなたは(コメントで)1つを提供しましmv
たrename
。さらにリンクがある場合は、共有できます。あなたが主張しているマニュアルページについても同様です。
これはあなたの質問に答えないことはわかっていますが、回避ループと比較してファイルの名前を変更する別の方法を探している場合は、なぜ使用しないのfind
ですか?このコマンドを何度も使用して、大きなディレクトリのファイル拡張子を何十万ものファイルに置き換えました。これは、POSIX準拠のシステムで動作するはずです。
find . -name "*.gappedPeak" -exec sh -c 'mv "$1" "${1%.gappedPeak}.bed"' _ {} \;
コマンドの内訳:
'
.
' => 'でマークされた現在のディレクトリから始まる検索パス。'
-name
=>検索一致名の設定(この場合、で終わるすべてのファイル.gappedPeak
)
-exec
=>一致するたびに次のコマンドを実行します
sh -c
=> 'exec'は、一致するたびに独立したシェル環境を作成します
mv "$1" "${1%.gappedPeak}.bed"
=> 現在のファイル名であるmv
最初の変数($ 1で示される)から新しい名前。ここでは、部分文字列の一致と削除を行います。したがって、最初の変数$ 1を再び使用%
し.gappedPeak
て、文字列から削除するために使用します。.bed
最後には、ちょうど今ある残りの変数を、連結して、新しい作成し、ファイル名を。test#
.bed
test#.bed
下線は$ 0のプレースホルダーです
{}
各(置き換えられている*.gappedPeak
ことで見つかった)、ファイル名find
、コマンド、およびなり、$ 1にsh
コマンド。
\;
-exec
コマンドの終わりを示します。';'
またはを使用することもできます";"
。
例:
[user@before]# ls -lh
total 0
-rw-r--r--. 1 root root 0 Jan 26 11:40 test1.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test2.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test3.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test4.gappedPeak
-rw-r--r--. 1 root root 0 Jan 26 11:40 test5.gappedPeak
[user@after]# ls -lh
total 0
-rw-r--r--. 1 root root 0 Jan 26 11:40 test1.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test2.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test3.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test4.bed
-rw-r--r--. 1 root root 0 Jan 26 11:40 test5.bed
file.abc
-> の別の簡単な例を次に示しblub.xyz
ます。find . -name "file.abc" -exec sh -c 'mv "$1" "$(dirname $1)/blub.xyz"' _ {} \;
mv *.txt *.tsv
動作しません。mv
一度に1つのファイルのみ名前を変更できます。説明を誤解しているか、間違っています。
mmv
そして、rename
一度に複数のファイルの名前を変更することができます。しかし、rename
around には2つのバージョンがあり、それぞれ異なる方法で呼び出されます。ここでそれについて多くの質問があるはずです。
rename
、ではなくを使用していmv
ます。
mv *.txt *.tsv
mv
(通常は)見ていない*.txt
か*.tsv
が、シェル拡張ファイル名。これらのワイルドカードが展開するファイルの数は「ランダム」です。これが機能する唯一の状況は、名前*.txt
が(文字通り)に変更される名前のファイルがある場合です*.tsv
(引用符なしでbash
オプションをnullglob
設定しないでください)。
foo.txt
と1という名前の既存の上書きされますファイルを...baz.tsv
mv *.txt *.tsv
.tsv
あなたが持っている場合たとえば、asd.txt
とqwe.txt
あなたはコマンドを実行すると、ディレクトリ内のファイルmv *.txt *.tsv
は、名前のディレクトリにこれらの2つのファイルを移動しようとします*.tsv
。そのようなディレクトリがないため、エラーが発生します。
考慮すべきもう1つのオプションは、以下を使用することです。
cp -p *.txt *.tsv
rm -f *.txt
*.txt
し*.tsv
ながらすべてのファイルをコピーします-p
。*.txt
mv
、ファイルが別のパーティションにない限り、実際にファイルを移動せずに単に/ directory / filenameを変更するよりも遅いです。