Dosyaları iç içe alt dizinlerden ubuntu'da başka bir klasöre nasıl taşırım? (Birçok alt klasörü çıkarmaya çalışıyorum)


36

Dosyaları nasıl klasörlere değil başka bir klasöre / üst klasöre taşıyabilirim ?

Son derece çirkin bir klasör yapısına sahibim, bazı .mp3 dosyalarında bir alt klasörde 6 seviye derin gömülü.

Ubuntu kullanarak tüm alt dizinleri olmayan tek bir dizindeki tüm dosyaları (çoğunlukla .mp3 ancak hepsini değil) bitirmek istiyorum.

Yardım et?

Yanıtlar:


48

Askubuntu-QA'da harika bir cevap var .

Bunu yapmak için, bir terminal açın ve bu komutu çalıştırın:

mv  -v ~/Downloads/* ~/Videos/

Tüm dosya ve klasörleri İndirilenler klasöründen Videolar klasörüne taşıyacaktır.


Tüm dosyaları taşımak, ancak klasörleri taşımak için:

Ancak, tüm dosyaları (ancak klasörleri değil) Yüklemeler klasöründen Videolar klasörüne taşımak istiyorsanız, bu komutu kullanın.

find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Videos

Yalnızca dosyaları İndirme klasörlerinden taşımak, ancak alt klasörlerden taşımak için:

Tüm dosyaları İndirilenler klasöründen taşımak, ancak İndirme klasöründeki klasörler içindeki hiçbir dosyayı taşımak istemiyorsanız, bu komutu kullanın:

find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videos

burada -maxdepthseçenek 1, yalnızca derinlemesine bulmanın ne kadar deneneceğini , yalnızca bul komutunda belirtilen dizini belirtir. Sen kullanarak deneyebilirsiniz 2, 3ayrıca teste.

Ayrıntılı bir açıklama için Ubuntu find man sayfasına bakın .

Kaynak


Eğer yapmak istediğim, tüm dosyaları klasöre kopyalamaksa, mv'yi cp olarak değiştirmem gerekecek mi? Linux için
yeniyim

13

Çözüm

find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +

Komut altındaki tüm düzenli dosyaları bulacaksınız /src/dir(tüm alt dizinleri dahil) ve onları taşımak /dst/dirkomutun kullanımı ile mv. Sadece dizinleri sizinkilerle değiştirin. Aynı ada sahip dosyalar otomatik olarak yeniden adlandırılır.

Taşınacak dosyaları seçme

Sadece MP3 dosyalarını taşımak istiyorsanız, sonradan komuta -iname "*.mp3"seçenek ekleyin .find-type f

C0dev tarafından cevap karşılaştırılması

C0dev'in cevabındaki sadece ikinci komut soruyu cevaplıyor. Aşağıda bu cevap ile nasıl karşılaştırıldığı gösterilmiştir. 3. ve 4. puanlar diğer cevaplarda da aynı şekilde çözülebilir.

  1. mvÇözüm dışında , veya -exec +benzeri bir komut çağırmanız gerekmez ve dosya adlarını iki kez teslim edin.xargsparallel
  2. Diğer cevap, aynı ada sahip dosyaların üzerine sessizce yazacaktır. Burada seçenek sayesinde dosyalar otomatik olarak yeniden adlandırılır --backup=numbered. Ne yazık ki, bu gibi soneklere sahip bu yedeklemeler, ~3~varsayılan olarak dosya yönetimlerinin çoğunda gizlenecektir. Maalesef mvson ekin değiştirilmesine izin vermiyor, ancak ek komutlarla kolayca işlenebilir. Bu bir GNU uzantısıdır.
  3. Bunun aksine -print0 -exec command {} +, IEEE Std 1003.1 (POSIX), ISO / IEC 9945 ve Tek UNIX Şartname standartlarının bir parçasıdır. Bu nedenle daha taşınabilir olması gerekir. Bkz. IEEE Std 1003.1, 2004 Sürümü , IEEE Std 1003.1, 2013 Sürümü ve 0000243: "Bulmak" için -print0 ekleyin . Ancak yine de gerekli -tanahtar mvbir GNU uzantısıdır, dolayısıyla tüm komut POSIX sistemleri arasında taşınabilir değildir.

Not: durumda findile başlayan yolları üretmek mümkün olacaktır -(Ben herhangi böyle uygulama bilmiyorum find. Şu anda) {}-sonu seçenekleriyle göstergesi önünde olmalıdır: --.


Hata: Bul: `-exec 'eksik argümanı
Chris,

@Chris: Haklısın, bu {}son tartışma gibi görünüyor . Düzeltildi.
pabouk

@Chris: İstediğiniz gibi çalışıyor mu şimdi? Cevabınız evet ise, cevabınızı muhtemelen kabul edilemez, böylece sorunuz “çözülmemiş” olarak görünmez.
pabouk

Çalıştığım şey ve bu dizin bulunamadı hataları:
Chris

Ne çalıştırıyorum: clstal @ alkış: ~ $ ls 1. script.R Firefox_wallpaper.png part1vidproj zotero pdf yöneticisi Masaüstü mozilla.pdf Resimler Belgeler ana Videolar clstal @ clap: ~ $ find / kaynak / dizin-tipi f -exec mv -t / destination / directory {} + find: `/ source / directory ': Böyle bir dosya veya dizin yok
Chris

2

Ne yazık ki, işaretli çözüm hakkında yorum yapacak kadar yüksek bir itibarım yok. Ancak, karşılaştığım bir konuda başkalarına da dikkat etmek istedim. Oldukça amatör; Ancak, birkaç şey yaparken ilk başta akla gelmeyebilir. Umarım, başkalarına yardımcı olacaktır.

Sorun

Komutu başlattıktan sonra aşağıdaki mesajın farklılıkları sağlandı. Komut daha sonra birden fazla dosya oluşturur.

mv: `/data/share/docs/src/dir/filename.ext' and `/data/share/docs/src/dst/filename.ext' are the same file

Sebeb olmak

Bu (örneğin ) /srcbir ebeveynidir ./dst/src/../dst/

Çözüm

Daha iyi bir çözüm olabilirken, dosyaları basitçe /srcdışımdaki geçici bir dizine taşıdım ve sonra da /src/../dstdizine girmelerini istediğim komutu yeniden gönderdim .


2

Tek astarım - bu Mac’lerde çalışır ancak aynı zamanda herhangi bir * nix’te de yapılması gerekir. Üst dizinden başlayın.

# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf

İlk bölüm, tüm alt klasörlerden her şeyi, komutu başlattığınız yerden gerçek klasöre taşır; ikinci bölüm, alt dizinlerin boş olup olmadığını kontrol eder (şimdi :-) yazmalı ve onları silmeli, böylece her şeyi alt dizin olmadan almalısınız.)


(1) Lütfen cevabınızın ne yaptığını ve diğer cevaplar üzerindeki avantajlarını (çok benzer) açıklayınız. Lütfen yorumlara cevap vermeyin;  cevabınızı daha net ve eksiksiz hale getirmek için düzenleyin . (2) -notOperatörün standart olmadığını ve bu nedenle komutunuzun diğerlerinden daha az taşınabilir olduğunu unutmayın.
Scott

Bul not tipi d -print0 | xargs -0J% mv -f%. ; Bul tipi d -depth -print0 | xargs -0 rm -rf Bu komutu bir klasörde çalıştırdım ve alt klasörleri, içinde bulunduğum klasörü sildim ve sonra üst klasöre taşıdım. Neyse ki dosya yöneticimi izliyordum ve komutu durdurmayı başardım ve bir test klasöründe çalıştırıldı.
olacak

1

Terminal'i açın, cd ile klasörler klasörünüze gidin ve find . -mindepth 2 -type f -print -exec mv {} . \; bu alt dizinlerden tüm dosyaları mevcut klasöre taşımak için çalıştırın .

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.