Bash'ta yolu tekrar etmeden bir dosyayı nasıl yeniden adlandırabilirim? [çift]


39

Olası Çoğalt:
Bir bash komutunda metni yeniden kullan

Bir dosyayı birkaç dizin derinliğinde yeniden adlandırmak istersem, yolu tekrarlamaktan nasıl kaçınabilirim?

Örneğin:

mv path/to/old_filename.txt path/to/new_filename.txt

Bunu yapmanın bir yolu olup olmadığını merak ediyorum:

mv path/to/old_filename.txt (?)new_filename.txt

Nerede (?)"aynı dizinde" demenin bir yolu olurdu.

Yanıtlar:


26

Bash geçmişi genişlemesini kullanarak :

mv path/to/oldfile !#:1:h/newfile

burada !#:1:h: şu anda yazdığınız satırdan ("! #"), ilk sözcüğü (": 1") alın, ardından yalnızca yol bileşenini (": h" - baş) kullanın.


Bu, orijinal sorgulayıcının çözümün ne olabileceğini varsaydığına en yakın olanıdır ve bilmek faydalıdır, yani +1.
crazy2be

2
Güzel! Darth'ın küme ayraç genişletme yönteminin daha kolay olduğunu düşünüyorum, ama tam olarak istediğim bu.
Nathan Long

Bugün iki yeni şey öğrendim. Ayrıca, sonsuza dek "Darth's brace genişlemesi" olarak brace genişlemesini düşüneceğim, çünkü kulağa harika geliyor.
PileOfMush

62

Ayraç genişletme kullanabilirsiniz: mv path/to/{old_filename.txt,new_filename.txt}

Burada , bir ikame listesi tanımlayan ve bash'e tekrar ettiği her seferinde farklı bir ikame kullanarak parametreyi tekrar etmesini söyleyen bash kabuğundaki destek genişlemesi ile ilgili GNU kılavuzuna bir link verilmiştir.

Örneğin,

a{b,c,dd,e}

genişletilecek

ab ac add ae

Tek uyarı, genişletilmiş tekrarların, hedef programın argümanları olarak birbirlerini takip edebilmeleri gerektiğidir.


5
Ya minimumda tutmak: mv path/to/{old,new}_filename.txt. Bu aynı zamanda komutun tersine çevrilmesine veya başka türden tekrarlara yakın olmasına yardımcı olur. Örneğin mv /etc/X11/xorg.conf{,.backup}, işlemi basit değişikliklerle tersine çevirmek gibi birçok kez yaptım mv /etc/X11/xorg.conf{.backup,}.
Daniel Andersson

26

Darth'ın yukarıdaki cevabı zekicedir, ancak bir yaklaşım kullanmak istiyorsanız cd, bir alt kabuk kullanmayı da düşünebilirsiniz:

(cd path/to && mv old_filename.txt new_filename.txt)

Dizin değişikliği alt kabukta gerçekleştiğinden, aslında etkileşimli kabuğunuzdaki dizinleri değiştirmezsiniz.


1
Önemli dezavantaj: Sekme tamamlamayı kullanamazsınız old_filename.txt.
bluenote10

9

Dizinde birkaç komut yapacaksanız, faydalı olabilecek başka bir alternatif şudur:

pushd /path/to
mv oldfile newfile
...
popd

5

@ Darth'ın cevabını seviyorum . İşte bir alternatif:cd path/to && mv oldfile newfile && cd -


1
Not eğer mv(örneğin izin yok) Eğer bırakılacaktır başarısız path/todizine. Her zaman çalıştırıldığından cd path/to && mv oldfile newfile ; cd -emin olmayı deneyebilirsiniz cd -, cd path/to(izin yok) başarısız olursa, hala yürütülür cd -ve istenmeyen önceki dizine gidersiniz. mlc (+1) alt kabuk cevabı daha iyidir. Sanırım cd . && cd path/to && mv oldfile newfile ; cd -ile (zamanın% 99.9 çalışacak cd .sadece sizin veya şimdiki dirs izinleri değişirse başarısız ve farklı dir gidiyor bu durumda bir sonucun kötü değil.
dr jimbob
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.