Dizini taşıma işleminin hedefi olarak değiştirme


12

Bazen bir dosyayı düzenledim ve farklı bir klasöre taşımak istiyorum. (Genellikle: Klasörün diğer sahiplerine sürekli güncellemeler vermekten kaçınmak istemediğim bir Dropbox klasörüne.) Bunu, örneğin,

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

Daha sonra, genellikle kendimi önceki taşıma işlemimin hedef dizinine değiştirmek istedim. Kendimi yukarı oka vurduğumu, finali sildiğimi, file.pdfsola tuttuğumu, sildiğim mv file.pdfve değiştirdiğimi görüyorum cd.

Bunu yapmanın daha hızlı ve daha akıllı bir yolu var mı? Bir "dosya taşı ve ardından dizini değiştir" komutu veya son kullanılan dizin için bir kısayol veya bunun gibi bir şey var mı?


1
CTRL + Sol tuşlarını basılı tutarsanız, daha hızlı olan kelime ile sola gider
cat

Yan yorum, kabuk sorunuzun cevabı değil: Düzenlerken genellikle Dropbox'ı duraklatıyorum. Ayrıca başka hiçbir dosyanın "ayaklarımın altında" değişmemesini sağlar.
Constantino Tsarouhas

Yanıtlar:


17

Eğer bash kullanıyorsanız, tarih etkileşimi bunun için sadece kısayola sahiptir. Kelime planlayýcýsý önceki komuta son argüman için:

!!:$
önceki komutun son argümanını belirtir. Bu kısaltılabilir !$.

Son yol adı bileşenini kaldırmak için bir değiştirici ile birlikte :

İsteğe bağlı sözcük işaretleyiciden sonra , her biri önünde bir ':' işareti olan bir veya daha fazla geçerli değiştiriciden oluşan bir dizi ekleyebilirsiniz .

h
Yalnızca kafa bırakarak, izleyen yol adı bileşenini kaldırın.

Yani:

$ echo /ab/c/d
/ab/c/d
$ echo !$:h
echo /ab/c
/ab/c

Aynı kısayol zsh ile de kullanılabilir.


1
Bu çok havalı.
Elder Geek

4

Dosya adını değiştirmiyorsanız, atlayabilirsiniz ve mv otomatik olarak ekleyecektir; bu özellikle birden fazla dosyayı taşırken yararlıdır:

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/

mv *.pdf ../../../Dropbox/sharedfolder/subdirectory/

Dizini son argüman olarak kullanarak !!:$veya !$muru'nun cevabının açıkladığı gibi kullanabilirsiniz .
Bash'i normal varsayılanlarla kullanıyorsanız, bunun yerine Alt+ kullanabilirsiniz ..
(Bu readline insert-last-argumentkomutudur; bind -pmevcut tüm bağlantılarınızı listeler.)


1
hedef dosya adını atlamanın, zaten varsa sessizce hedef dosyanın üzerine yazabileceğini unutmayın
cat

mv-i/ --interactiveveya -n/ seçeneklerini belirtmediğiniz sürece, her zaman hedef dosyaların üzerine sessizce yazar --no-clobber. Ben bu yüzden elimizde alias mv='mv -i' cp='cp -i'skinTenimde .bashrc.
David Foerster

-1

Başka bir yaklaşım, bu amaca yönelik kendi komutunuzu oluşturmaktır. Bu, aşağıdakine benzeyen bir işlevle yapılabilir :

$ function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }

Burada: (1) mv-special işlev adıdır; (2) değişkenler $1ve $2fonksiyondaki komutlar tarafından kullanılacak argümanlar mvve cd; (3) $(echo $2-) var dizesinin sonuna bir yaban kedisi karakteri ekler ve değişkenin yalnızca yol içeriyorsa $2davranışını düzeltir ; (4) yalnızca yoldan filtre uygular .dirname$2 $(dirname $(echo $2-))$2

Bu cevaba göre fonksiyon şöyle görünebilir:

$ function mv-special { mv $1 $2; cd ${2%/*}; }

Nerede: ${2%/*}yalnızca yoldan filtre uygular $2.

Komut olarak kullanılabilmesi için bu işlevin dışa aktarılması gerekir :

$ export -f mv-special

Kullanımı:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

veya:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/

Lütfen her iki değişken için de ikinci argümanın ( $2) dosya adı veya eğik çizgi ( /) ile bitmesi gerektiğine dikkat edin .

Kalıcı olarak kullanılabilen yeni komutumuz olmak için, işlevin tanımı ve dışa aktarma komutunun aşağıdakilere eklenmesi gerekir ~/.bashrc:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }
export -f mv-special

veya:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd ${2%/*}; }
export -f mv-special

resim açıklamasını buraya girin


Özel komut, içine ~/binveya içine yerleştirilen yürütülebilir komut dosyası aracılığıyla yapılabilir /usr/sbin: Nasıl özel bir terminal komutu oluşturabilirim (komut dosyasını çalıştırmak için)? Ama dürüst olmak gerekirse, bu senaryoda davranışıyla ilgili bir sorunla karşılaştım cd.

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.