Saya ingin mengubah nama file untuk mengubah ekstensi mereka, secara efektif ingin dicapai
mv *.txt *.tsv
Tetapi ketika melakukan ini saya mendapatkan:
* .tsv bukan direktori
Saya merasa agak aneh bahwa 10 hits google show pertama mv
harus bekerja seperti ini.
Jawaban:
Saat Anda mengeluarkan perintah:
shell, mari kita asumsikan bash, perluas wildcard jika ada file yang cocok (termasuk direktori). Daftar file diteruskan ke program, di sini
mv
. Jika tidak ada kecocokan yang ditemukan, versi yang tidak dikembangkan dilewatkan.Sekali lagi: shell memperluas polanya, bukan programnya.
Banyak contoh mungkin cara terbaik, jadi di sini kita mulai:
Contoh 1:
Sekarang yang terjadi di
mv
telepon adalah bahwa shell mengembang*.txt
ke file yang cocok. Karena tidak ada*.tsv
file yang tidak diubah.The
mv
perintah disebut dengan dua argumen istimewa :argc
: Jumlah argumen, termasuk program.argv
: Array argumen, termasuk program sebagai entri pertama.Dalam contoh di atas itu akan menjadi:
The
mv
program pemeriksaan untuk melihat apakah argumen terakhir,*.tsv
, adalah sebuah direktori. Karena tidak, program tidak dapat melanjutkan karena tidak dirancang untuk menggabungkan file. (Biasanya memindahkan semua file menjadi satu.) Atau membuat direktori dengan hati-hati.Akibatnya, ini membatalkan dan melaporkan kesalahan:
Contoh 2:
Sekarang jika Anda mengatakan:
The
mv
perintah dijalankan dengan:Sekarang, sekali lagi,
mv
periksa untuk melihat apakah*.tsv
ada. Karena tidak filefile1.txt
dipindahkan ke*.tsv
. Yaitu: file diubah namanya menjadi*.tsv
asterisk dan semuanya.Contoh 3:
Jika Anda sebaliknya berkata:
The
mv
perintah dijalankan dengan:Karena
*.tsv
sekarang adalah direktori, file akhirnya dipindahkan ke sana.Sekarang: menggunakan perintah seperti
some_command *.tsv
ketika tujuannya adalah untuk benar-benar mempertahankan wildcard, orang harus selalu mengutipnya. Dengan mengutip Anda mencegah wildcard tidak diperluas jika harus ada kecocokan. Misalkan katakanmkdir "*.tsv"
.Contoh 4:
Perluasan lebih lanjut dapat dilihat jika Anda lakukan misalnya:
Contoh 5:
Sekarang:
mv
perintah dapat dan berfungsi pada banyak file. Tetapi jika ada lebih dari dua yang terakhir harus menjadi direktori target. (Secara opsional Anda dapat menggunakan-t TARGET_DIR
opsi, setidaknya untuk GNU mv.)Jadi ini tidak masalah:
Di sini
mv
akan dipanggil dengan:dan semua file berakhir di direktori
foo
.Adapun tautan Anda. Anda telah memberikan satu (dalam komentar), di mana
mv
tidak disebutkan sama sekali, tetapirename
. Jika Anda memiliki lebih banyak tautan, Anda dapat membagikannya. Juga untuk halaman manual di mana Anda mengklaim ini diungkapkan.sumber
Saya tahu ini tidak menjawab pertanyaan Anda, tetapi jika Anda mencari cara lain untuk mengganti nama file dibandingkan dengan loop penyelesaian Anda, mengapa tidak digunakan
find
? Saya telah menggunakan perintah ini berkali-kali untuk mengganti ekstensi file di direktori besar dengan ratusan ribu file di dalamnya. Ini harus bekerja pada sistem yang mendukung POSIX:Perintah Breakdown:
Contoh:
sumber
file.abc
->blub.xyz
dalam beberapa subdirektori:find . -name "file.abc" -exec sh -c 'mv "$1" "$(dirname $1)/blub.xyz"' _ {} \;
mv *.txt *.tsv
tidak bekerja;mv
hanya dapat mengganti nama satu file pada satu waktu. Anda salah memahami penjelasannya atau salah.mmv
danrename
dapat mengganti nama beberapa file sekaligus. Tetapi ada dua versirename
sekitar yang disebut berbeda. Seharusnya ada banyak pertanyaan tentang itu di sini.sumber
rename
, bukanmv
.mv *.txt *.tsv
mv
(biasanya) tidak melihat*.txt
atau*.tsv
tetapi nama file diperluas shell. Jumlah file yang diperluas ke wildcard ini akan menjadi "acak". Satu-satunya situasi di mana ini bekerja adalah jika ada file dengan nama*.txt
yang akan diubah namanya menjadi (secara harfiah)*.tsv
(tanpa mengutipbash
opsinullglob
tidak boleh diatur).foo.txt
dan satu bernamabaz.tsv
yangmv *.txt *.tsv
akan menimpa yang ada.tsv
file ...Sebagai contoh, jika Anda memiliki
asd.txt
danqwe.txt
file dalam direktori ketika Anda menjalankan perintahmv *.txt *.tsv
, ia mencoba untuk memindahkan dua file ini ke dalam direktori bernama*.tsv
. Karena tidak ada direktori seperti itu, itu memberikan kesalahan.sumber
rename(1)
rename
adalah skrip perl oleh Larry Wall pembuat perl. Dibutuhkan regex Perl dan beroperasi pada nama file.Instalasi
Debian / Ubuntu
Jika Anda perlu menginstal
rename
di Debian / Ubuntu yang dapat Anda lakukansumber
Pilihan lain untuk dipertimbangkan adalah menggunakan:
*.txt
file*.tsv
sambil mempertahankan atribut mereka menggunakan-p
flag.*.txt
mv
yang hanya mengubah / direktori / nama file tanpa benar-benar memindahkan file kecuali mereka berada di partisi yang berbeda.sumber