Tüm dosyaları alt klasörlerden üst klasöre taşımak için Shell komut dosyası


47

Klasörde bir sürü klasör var A. Tüm bu klasörlerdeki dosyaları taşımak istiyorum A.

Veya

Tüm dosyaları alt klasörlerden kesip üst klasöre yapıştırmak istiyorum.

Bu nasıl yapılır?


1
Bunu kusursuz veya başka bir şey olarak test etmedim, ancak bu komutu Terminal A'dan bir terminalde girmeyi denediniz mv */* .mi?
Marty Fried

Çift dosya adı olmadığından emin misiniz?
jippie

mv */* .dosyaları alt klasörlerin alt klasöründen taşımaz.
Rahul Virpara

@jippie evet, yinelenen ad yok
Rahul Virpara

Yanıtlar:


81

ADizine git ve koş

find . -mindepth 2 -type f -print -exec mv {} . \;

bu, "bu dizindeki ve alt dizinlerindeki tüm dosyaları bul ve hedef dizine sahip mv'yi çalıştır" anlamına gelir.


1
Ayrıca, zaten ana dizinde bulunan dosyaları da taşımaya çalışır.
Rahul Virpara

virpara: şimdi bu sürümünüz .dot dizinindeki tüm dosyaları unutuyor. Uyarıları bastırmak yerine -mindepth 2 ile revize edildi.
Tuminoid,

1
GNU ile findbiraz daha şık olabilir ve mvher dosya için bir işlem ortaya find A -mindepth 2 -type f -exec mv -t A \{\} +
koyamazsınız

David, sürümünüz maksimum komut satırı uzunluğu sınırına ulaşana kadar çalışır; bu, özellikle örneğinizde olduğu gibi, A'dan başka bir dizinden çağırmanız durumunda, yolları nasıl bastırdığını bulmak zor değildir.
Tuminoid

9
Bu çok tehlikelidir. farklı alt klasörlerde aynı dosya adına sahip dosyalarınız varsa, bunların sonuncusu üzerine yazacaksınız. find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
Mv'yi

4

Bir dosya oluşturabilir ve "cutme" olarak adlandırabilirsiniz (terminal türünde cutme adlı bir dosya oluşturmak için nano cutme. Kaydetmek için CTRL + X tuşlarına basıp ENTER tuşuna basın.) Örneğin aşağıdakileri yapıştırarak şunları yapıştırın:

  1. Bunu özyinelemeli olarak yapmak istiyorsunuz (Bu alt klasörlerin alt klasörlerinde ve alt klasörlerinde)
  2. Senaryo dosyasını taşımayı atlamak istiyorsun
  3. Dosyaları bu klasöre taşıma izniniz var
  4. Dosyalar adlarında boşluk içerebilir veya içermeyebilir

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Satır içindeki adı cutme unutmayın . Çalıştıracağınız komut dosyası ile aynı olmalıdır.

Dosyayı oluşturduktan ve yukarıdaki satırı yapıştırdıktan sonra, aşağıdakileri komut dosyasıyla aynı klasörde çalıştırın:

chmod +x cutme. Bunu böyle yürütebileceği şekilde bu "Çalıştırılabilir" bayrak Yeni dosyanızı verecektir: ./cutme.


Neden zaten ana dizinde bulunan dosyaları taşımaya çalışmalıyım?
Rahul Virpara

Komut dosyasını klasörün içinden çalıştırırsınız. İçindeki her dosya, bir alt klasörün içinde veya olmasın, klasörün ana klasörüne taşınır. Buradaki ana klasör, betiğin bulunduğu yere göre üst öğedir. Aslında son 2 noktayı değiştirerek, tüm dosyaları betiği çalıştırdığınız bir klasörün içine nereye taşıyacağınızı söyleyebilirsiniz.
Luis Alvarado
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.