Unix: Kısa çizgi ile başlayan dosyalar, -


19

Tamam, bir çizgi ile başlayan bir sürü dosyam var. Bu o kadar iyi değil ... ve onları yeniden adlandırmak istiyorum. Benim özel durumumda sadece önüne bir karakter koymak istiyorum.

Çalışması gereken şu satırı buldum, ancak bu nedeniyle çizgi:

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

Bir koyarsanız echoönünde mvI bir demet olsun

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

Doğru olan, elbette ki ilk dosya adının seçenek olduğunu düşünecek. Bu yüzden kaldırdığımda echove çalıştırdığımda, sadece birkaç demet alıyorum

mv: illegal option -- N

Olarak değiştirmeyi denedim

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

ama tırnaklar gözardı edilmiş gibi görünüyor. Tek tırnak kullanmaya çalıştım, ancak sonra değişken genişletilmedi ... Burada ne yapabilirim?

Güncelleme: Şimdi teklifleri alıntı yapmaya çalıştım. Bunun gibi:

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

Ve bunu yankıştığımda, doğru görünüyor, ama gerçekten çalıştırdığımda sadece alıyorum

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

Ben ... şimdi bunun nasıl sadece hayır ipucu iç çekiş


Yanıtlar:


27

Mv komutuna argümanların seçenek olarak yorumlanmaması --gerektiğini söylemek için anahtar kelimeyi kullanmanız gerekir . İzlemek:

$ 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

Komut satırındaki tüm seçeneklerden -- sonra kullanın . Örneğin, mv-i seçeneğini kullanmaya çalışıyorsanız , daha önce de geçerli olur : --

mv -i -- -filename-begins-with-dash newfilename

6
Aaah. Bunun hakkında hiç düşünmedim. Bu arada ./, çalışacak olan dosya adının önüne da yapışabileceğimi öğrendim . Ama bu elbette daha düzenli bir seçenek :)
Svish

@Svish: bu adil, dosya adını da hazırlamayı düşünmedim ./. ama haklısın, bu durum için de işe yarıyor.
quack quixote

7
Not --seçenekleri kongre ve tüm programlar tarafından saygı değil gibi başka argümanlar işleme koymuyoruz anlamı. Bazıları bunun için yalnız -, bazıları ise bu amaç için hiçbir şeyi kabul etmiyor . Bu yüzden hazırlık ./yapmak akılda tutmaya değer.
dmckee

@dmckee haklı; --özel bir argüman olarak bir GNU uzantısıdır, ancak POSIX kurallarında da belirtilmiştir. bölüm 12.2, kılavuz 10: opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ... bu, çoğu POSIX ve GNU yardımcı programının sözleşmeye saygı duymasını beklediğiniz anlamına gelir, ancak diğerleri bunu kabul etmeyebilir.
quack quixote

6

Başka bir teknik ise ana dizini dosya adıyla birlikte eklemektir ...

'-File-to-rename' dosyasını 'to-rename' olarak yeniden adlandırmak için ...

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

Teşekkür ederim @Skippy le Grand Gourou. ./-File-to-rename'in çalıştığı mvve çalıştığı doğrulandı rm.

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

rm  ./-file-to-rename

1
Ya da daha iyisi, daha önce belirtildiği gibi, quixote'un cevabını kullanarak yapılan yorumları quackote ./.
Skippy le Grand Gourou
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.