Geçerli klasördeki tüm dosyalar alt klasöre nasıl taşınır?


70

Yoldayım:

/myuser/downloads/

Ve bir alt klasör oluşturuyorum:

/myuser/downloads/new

Şimdi indirilenler klasöründeki tüm dosyaları ve klasörleri / alt klasörleri alt klasöre taşımak istiyorum.

bunu nasıl yapabilirim?

Denedim:

mv -R *.* new/

Ancak hareket göründüğü gibi -R anahtarı almaz.


4
-R'ye ihtiyacınız yok. Sadece mv * newGerçi, “yeniye geçemez” ya da benzer bir şey sızlayacak. Belki mv -i * newde size yazmasını engellersiniz.

Yanıtlar:


101

Komuta

mv !(new) new

hile yapmalı. İşe yaramazsa, shopt -s extglobönce koş .

Ayrıca gizli dosyaları / dizinleri (bir nokta ile başlayan) taşımak için önce de çalıştırın shopt -s dotglob.
Yani, özetlemek gerekirse:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

( dotglobKötü sürprizlerden kaçınmak için kümelemek her zaman daha iyidir ).


5
önemi nedir bahseder misiniz !(something)?
Adeerlike,

2
@ adeer sadece bir şey söylüyor (bir şey). Başka bir deyişle, bir şeyi değil, her şeyi kopyalayın. Çamur kadar temiz?
RockyMountainSaat

4
çok. zsh'nin eşdeğerini biliyor musunuz?
Adeerlike,

1
Anlayamadım, örneğin ne klasörün içeriğini devgeçerli konumuma taşımaya çalışırsam yürütmem gerekir mv !(dev) devmi? Anladım-bash: !: event not found
Siyah

5
@adeer çok benzer. setopt extendedglobuzatılmış küre modunu zsh olarak ayarlamak için. ^dışlama sembolü, bu yüzden mv ^new newhile yapardı. o zaman zsh ile ayarlanan tüm seçenekleri görmek için setoptve kullanabileceğiniz genişletilmiş glob modunu devre dışı bırakmak için kullanabilirsinizunsetopt extendedglob
Mr. T

10

Böyle bir şey buldum ama anlaşılması biraz daha kolay ve sizin için de işe yarayabilir:

ls | grep -v new | xargs mv -t new

Yukarıdaki çözüme açıklama eklenmesi:

Man sayfalarından:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

Adım ile açıklanmıştır:

  • ls dosyaları geçerli dizinde listeleyecek
  • grep -v new borulu buna geri dönmeyecek
  • xargs mv -t newona aktarılan dosyaları grep -vhedef dizine taşıyacaktır

Ben bu yöntemi denedim ama alıyorum: mv: illegal option -- t. Bunu kullandığım için zshmi?
ConstantFun

@ConstantFun Zsh olabilir ama sizin uygulamanız olduğunu tahmin ediyorum mv, (mv sürümünüz kullandıklarımdan farklıdır) ne kullanıyorsunuz? Ben linux dağıtımı üzerinde ben bu cevabı yazarken inanıyorum centoskullanarak bash.
lockwobr

2
Sadece bunu osx üzerinde test ediyorum ve aynı hatayı alıyorum mv: illegal option -- t, çünkü osx'in mv'sinde -tseçenek yok.
lockwobr

1
(Bunu denemedim ve planlamıyorum.) Bu bağlantı apple.stackexchange.com/questions/69223/… , size gnu core cli utils, osx bsd ile yardımcı olacak gnucore'u nasıl kuracağınızı anlatıyor linux ile gelenlerden farklı olan cli araçları.
lockwobr

Ben OSX çalışıyor zsh, bu yüzden muhtemelen işletim sistemi o zaman ..? Aydınlattığın için teşekkürler!
ConstantFun

7

Basit bir fikir. İçinde bulunduğunuz varsayarsak / MyUser , yeniden adlandırmak indirmeleri için yeni yeni oluşturmak, indirme sonra hareket dizini yeni içine.

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

Tüm dosyaları bir klasörden alt klasörlerinden birine taşımak istiyorsanız, aşağıdaki komutu kullanabilirsiniz:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

Tüm dosyaları bulur ve daha sonra alt klasörünüze taşır.

@waltinator: -type d -name 'new' -prunegeçişini önlemek için eklendi /myuser/downloads/new.


newBu komutu adında bir alt dizin oluşturdum ve denedim, alıyorum mv: missing file operandveTry 'mv --help' for more information
mook765 13:16

1

Bu alternatif işlemi deneyebilirsiniz –– yolda kalın

/myuser/downloads/

ancak, bunun yerine ilk yaratma /myuser/downloads/new/dizini yerine bir klasör oluşturmak /myuser/komutla, dizindeki mkdir ../newsonra, tüm dosyaları taşımak downloadsiçin new, ve son olarak hareket newiçine downloads. Bunu bir satırda, /myuser/downloads/yoldayken, şu komutla yapabilirsiniz:

mkdir ../new && mv * ../new && mv ../new ../downloads

Bu durumda, dosya / klasörlerin herhangi bir şekilde "filtrelenmesi" konusunda endişelenmenize gerek yoktur, çünkü newaynı şekilde yolun seviyesindedir downloads, bu nedenle her şeyi içeri taşıyabilir ve ardından indirme downloadsişlemine newgeçebilirsiniz new.

Ancak, zaten alt klasörü varsa newoluşturulan ve başka bir tane oluşturmak için endişe etmeyin istemiyorum - sadece değiştirmek mkdirbirinci sol taraftaki komutu &&bir yukarıda gösterilen komuta mviterek, komuta newkadar yol, yörünge; Siz hâlâ ederken diğer bir deyişle, /myuser/downloads/size değiştirebilirsiniz mkdir ../newiçin mv new ... Sonra new[yoldaki /myuser/downloads/new/] alt klasörü /myuser/new/aynı seviyeye kadar itilir /myuser/downloads/ve ardından komutun geri kalanını yukarıda gösterildiği gibi çalıştırabilirsiniz. Hep birlikte, yoldan başlıyoruz /myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

ve "indirilenler klasöründeki tüm dosyaları ve klasörleri / alt klasörleri [ new] alt klasörüne taşımak istediğinizden ", bitirdiniz! Yalnızca dosyaları (veya yalnızca klasörleri veya [daha ayrıntılı nesne hareketi ekle]) taşımak istemişseniz , bu gibi nesneleri "filtreleyebilen" diğer komutları kullanmanız gerekir grep. Yine de yukarıda verilen komutlar amaçlarınız için yeterli.

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.