Dizin yolunu tekrar etmeden uzun dizin yoluna sahip komut satırı taşıma dosyası


16

mvİkinci bağımsız değişkene tam yolu yazmadan komut yürütmenin herhangi bir yolu var mı ?

Misal:

mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz


1
Sadece cddizine ve mvoradan gitmenizin bir nedeni var mı?
— zpletan

Kendimi sık sık günlük işimde bu tür komutları birden çok dizin üzerinde yürütürken buluyorum. Genellikle belirli bir üst dizinden birkaç komut yürütmem gerekiyor.
— 12'de Finbarr

Her nasılsa bunu kullanarak buldum !! (çift ünlem işaretleri) bir terminalde son çalıştırılan komutu çalıştırmak için kullanır. Son komuta parametreler / metin de ekleyebilirsiniz, ancak asla son komuttaki metni değiştirmeyi / kaldırmayı denemediniz. Deneyin ve başarılı olursa bunu bir cevap gibi bırakacağım. İyi şanslar!
— Geppettvs D'Constanzo

Yanıtlar:


32

Bash küme ayracı genişletmeyi kullanabilirsiniz. Bu:

mv my/file/that/has/a/really/long/path/foo.{bar,baz}

genişleyecek:

mv my/file/that/has/a/really/long/path/foo.bar my/file/that/has/a/really/long/path/foo.baz

ve sonra mvbu iki argümanla yürütülür. Destek genişletme hakkında daha fazla bilgi için http://wiki.bash-hackers.org/syntax/expansion/brace adresine bakın .


3
Görkemli. Bunu yapabileceğini bilmiyordum.
— Finbarr

5

Destek genişletmeye alternatif olarak, bash kabuğunun geçmiş genişletme özelliklerini kullanabilirsiniz:

  • ! bir tarih genişlemesi sunar
  • # geçerli komutu belirten olay belirleyicisi
  • $ son argümanla ilgili kelime belirleyici

Sed benzeri bir s/pattern/replacementsözdizimi kullanarak genişletme üzerinde değişiklik yapabilirsiniz.

somecommand path/to/foo.bar !#$:s/.bar/.baz

Ör.

$ mv -v somepath/Original/Dir3/SubDir1/foo.bar !#$:s/.bar/.baz
mv -v somepath/Original/Dir3/SubDir1/foo.bar somepath/Original/Dir3/SubDir1/foo.baz
'somepath/Original/Dir3/SubDir1/foo.bar' -> 'somepath/Original/Dir3/SubDir1/foo.baz'

Özellikle yolu (örneğin, mvikame ile kolayca elde edilemeyen tamamen farklı bir ada sahip bir dosyaya) istiyorsanız, hdeğiştiriciyi kullanabilirsiniz :

$ mv -v somepath/Original/Dir3/SubDir1/foo.baz !#$:h/baz.foo
mv -v somepath/Original/Dir3/SubDir1/foo.baz somepath/Original/Dir3/SubDir1/baz.foo
'somepath/Original/Dir3/SubDir1/foo.baz' -> 'somepath/Original/Dir3/SubDir1/baz.foo'

Dahil olmak üzere diğer seçenekler için readline, bkz son argüman yank tuş kombinasyonları şu anda bash konsolda parametresinde yazılan yinelerseniz nasıl?


2

Deneyebilirsiniz:

pushd .
cd /really/long/directory/name/
mv whatever.1 whatever.2
popd

2

Değişken ile

  1. Dizini bir değişkene kaydedin: `DIR=./really/long/path/
  2. hamle kullan: mv "$DIR"foo.bar "$DIR"foo.bz

Bir satırda: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz


Dizin değiştirme

  1. Ayrıca cdçalışmak istediğiniz dizine de ulaşabilirsiniz:cd ./really/long/path
  2. ardından dosya adını değiştirin: mv foo.bar foo.bz

Bir satırda: cd ./really/long/path && mv foo.bar foo.bz


1
ikincisi tanıdık geliyor ;-)
— zpletan

2
&&Bu son tek astarda en iyi kullanım . Aksi takdirde, cdbaşarısız olursa,mv yanlış dizinde çalıştırılır ve muhtemelen bir dosyanın üzerine yazılır. İle cd ./really/long/path && mv foo.bar foo.baz,mv yalnızca cddizin değiştirilirse çalıştırılacaktır .
— geirha

-3

Dizin adını kısaltmak için diğer ad komutunu kullanabilirsiniz:

alias src='/directory/name/of/source'
alias dst='/directory/name/of/destination'
mv src dst

1
-1 alias test='/var/log' ; cd testverir -bash: cd: test: No such file or directory.
— zpletan
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.