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.