Unix: File dimulai dengan tanda hubung, -

19

Ok, saya punya banyak file dimulai dengan tanda hubung, -. Yang tidak begitu baik ... dan saya ingin mengubah nama mereka. Dalam kasus khusus saya, saya hanya ingin menempatkan karakter di depan mereka.

Saya menemukan baris berikut yang seharusnya berfungsi, tetapi karena gagal, baris ini tidak:

for file in -N*.ext; do mv $file x$file; done

Jika saya meletakkan echodi depan mvsaya mendapat banyak

mv -N1.ext x-f1.ext
mv -N2.ext x-f2.ext

Yang benar, kecuali tentu saja akan berpikir nama file pertama adalah opsi. Jadi ketika saya menghapus echodan menjalankannya saya hanya mendapatkan banyak

mv: illegal option -- N

Saya sudah mencoba mengubahnya

for file in -N*.ext; do mv "$file" "x$file"; done

tapi kutipannya sepertinya diabaikan saja. Sudah mencoba menggunakan tanda kutip tunggal, tetapi variabelnya tidak diperluas ... Apa yang harus saya lakukan di sini?

Pembaruan: Saya sekarang juga telah mencoba mengutip penawaran. Seperti ini:

for file in -N*.ext; do mv '"'$file'"' '"'x$file'"'; done

Dan ketika saya menggemakannya, itu terlihat benar, tetapi ketika saya benar-benar menjalankannya saya baru saja mendapatkannya

mv: rename "-N1.ext" to "x-n1.ext":: No such file or directory

Saya baru saja tidak tahu bagaimana melakukan ini sekarang ... sigh

Svish
sumber

Jawaban:

28

Anda perlu menggunakan kata kunci --untuk memberi tahu perintah mv bahwa argumen tidak harus ditafsirkan sebagai opsi. Menonton:

$ mv -N1.ext x-f1.ext
mv: invalid option -- N
Try `mv --help' for more information.

$ mv -- -N1.ext x-f1.ext
$ ls
x-f1.ext

Gunakan -- setelah semua opsi pada commandline. Misalnya, jika Anda mencoba menggunakan -iopsi untuk mv , itu akan pergi sebelum -- :

mv -i -- -filename-begins-with-dash newfilename
quack quixote
sumber
6
Aaah. Sama sekali tidak memikirkan hal itu. Sementara itu saya tahu saya bisa tetap ./di depan nama file juga, yang akan berhasil. Tapi ini tentu saja pilihan yang lebih rapi :)
Svish
@Vish: itu adil, saya tidak berpikir untuk menambahkan nama file dengan ./baik. tetapi Anda benar, itu juga berhasil, untuk situasi ini.
quack quixote
7
Perhatikan bahwa --makna tidak memproses argumen lebih lanjut karena opsi adalah konvensi, dan tidak dihormati oleh semua program. Beberapa menggunakan satu -untuk itu, dan beberapa tidak menerima apa pun untuk tujuan itu. Jadi, saling menandaskan ./perlu diingat.
dmckee
@ dmckee benar; --sebagai argumen khusus adalah ekstensi GNU, tetapi disebutkan dalam pedoman POSIX. lihat bagian 12.2, pedoman 10: opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ... ini berarti Anda dapat mengharapkan sebagian besar utilitas POSIX dan GNU untuk menghormati konvensi, tetapi yang lain mungkin tidak.
quack quixote
6

Teknik lain adalah memasukkan direktori induk dengan nama file ...

Untuk mengganti nama file '-file-to-rename' menjadi 'file-to-rename' ...

mv  ../parent-dir/-file-to-rename  file-to-rename

Terima kasih @ Skippy le Grand Gourou. Mengonfirmasi bahwa ./-file-to-rename berfungsi dengan mvdan rmseperti di ...

mv  ./-file-to-rename  ./--file-to-rename

rm  ./-file-to-rename
DocSalvager
sumber
1
Atau lebih baik, seperti yang sudah disebutkan dalam komentar untuk quack jawaban quixote, menggunakan ./.
Skippy le Grand Gourou