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.