Alt dizinlerdeki tüm dosyaları özyinelemeli olarak tek bir dizine nasıl taşıyabilirim?


10

Geçerli dizinin altındaki tüm dosyaları ve bir dizine tüm alt dizinleri toplamaya çalışıyorum. Aşağıdaki gibi bir şey deniyorum

find -type f -exec mv {} collection/{} \; 

ikincisi {}tam yolu verdiği için yukarıdaki komut çalışmaz , tüm dosyaları nasıl toplayabilirim?

Yanıtlar:


14

Kaldır {}dan mv, mvherhangi bir ana dizinleri görmezden hedef dizin olarak alacaktır:

find -type f -exec mv {} collection/ \;

ohh bu bana olmadı. teşekkürler :)
Bunny Tavşan

Soruya cevabımda söylediğim gibi, bu potansiyel olarak kötü bir fikirdir. Belki de bu argümanı kullanmak -maxdepth 1yardımcı olabilir.
loevborg

Düşünmeye gel, sorunuzu yanlış okudum gibi görünüyor :) Üzgünüm.
loevborg

@loevborg: Başlığa "özyinelemeli" ekledim. Hala karışıklık varsa, lütfen düzenleyin ve geliştirin :)
Lekensteyn

1
Bu cevabın daha hızlı varyasyonufind -type f -print0|xargs -0r mv -it colection/
Hildred

5

Kullanmak yerine find(ki bu işi iyi yapar), bu amaçla kabuğu da kullanabilirsiniz.

$ PWD - $ DEST arasındaki tüm dosyalara istediğinizi varsayalım. Doğal girişim şöyle olur:

mv $PWD/* $DEST

Bu nasıl çalışıyor? "$ PWD / *" ifadesi bu dizindeki tüm dosyaların adlarına genişler. Bu kabuk özelliğine "globbing" denir. Son argümanı mvhedef dizindir. Çok fazla dosyanız varsa, komut satırının uzunluğu sınırlı olduğu için bu çalışmaz.

Ancak çözüm, nokta dosyalarını - veya adı "." İle başlayan "gizli" dosyaları, dosyaları ve dizinleri atlaması sorununa sahiptir. Bunu çözmek için, kabuğunuza globbing yaparken dotfiles eklemesini söylemelisiniz. Bunu yapmak için şunu kullanın:

shopt -s dotglob

kullanırken bash(ve muhtemelen bashvarsayılanı değiştirmedikçe kullanırsınız ). Bu kabukta, yukarıdaki komut dotfiles için de çalışır.

Bir yana, zshbunu, duruma göre seçme seçeneğiniz vardır. Bunu yapmak için

setopt extendedglob

sizin .zshrc. Sonra kullanabilirsiniz

mv $PWD/*(D) $DEST

dotfiles dahil tüm dosyaları taşımak için. ("D", "GLOB_DOTS" seçeneğini geçici olarak etkinleştirme etkisine sahiptir).

Şimdi asıl soru, tüm normal dosyaları (dizinleri değil) tüm alt dizinlerden ve alt dizinlerinden tek bir dizine taşımaktı. Bu, aşağıdakilerle gerçekleştirilebilir zsh:

mv $PWD/**/*(D.)

Burada ifade **/*, globber'ı alt dizinlere özyinelemeli olarak alçaltır. D"Ayrıca dotfiles' seçeneğini; vasıta .araçlar 'sadece normal dosyaları değil dizinleri' ı seçin.


Peki ben de tüm alt dizinleri recurse istedim, ama herhangi bir şekilde bilgi yararlı, bu duruma çok kez rastlamak :)
Bunny Tavşan

Aslında, find bunun için aşırı değil, globbing sadece dosyaları değil, aynı zamanda dizinleri de seçecektir. Ediyoruz endişeler performansı hakkında size, ayrıca böyle bir şey kullanabilirsiniz: find -type f -exec mv -t collection/ {} +. Bunun nasıl çalıştığı ile ilgili kılavuz sayfasına bakın.
Lekensteyn

Lekensteyn, haklısın. Soruyu anladığım için cevabı şimdi güncelledim.
loevborg

2
Harika cevap, özellikle soru ile ilgili olmadığını çok kötü :).
crazy2be
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.