2016-04-03 29 views
0

1 GB'den küçük tüm dizinleri taşımaya çalışıyorum. Ben bu komutu kullanmaya çalışıyorum:1G'den küçük dizinleri taşıma

du -h -d 1 -t -1G | xargs -0 mv -it /destination/dir/ 

Ama bir hata mesajı alıyorum:

Yardım büyük takdir
mv: cannot stat [...] File name too long 

:)

+0

deneyin Xargs için '-L 1' ekleyerek:' du -h -d 1 -t -1G | xargs -0 -L 1 mv -it/destination/dir/' – saeedgnu

+0

Teşekkürler :) '-L 1' ile denedim ama aşağıdaki hata iletisini üretir, 'mv: duv' olamaz du -h -d 1 -t - 1G \ n ': Hayır böyle bir dosya ya da dizin 'Ben de denedim' -n1 'ama aynı zamanda bana bir hata mesajı verdi' mv: geçersiz seçenek -' h'' – nimrag

cevap

0

İşte bu, gereksinimlerimi karşılayan bir çözüm. Belki biri üzerinde genişleyebilir? Her neyse, alt dizinler için endişelenmenize gerek yok, o zaman aşağıdaki işler.

du -Sb -t -1G | cut -f 2- | xargs -d "\n" mv -t /path/to/destination/ 
0

emin değilim kullandığınız neden -0 argümanı, xargs argümanında, dosya adlarının boşluklardan ziyade boş baytlarla ayrıldığını belirtir. du çıktısı hiçbir null bayt içermeyecek, dolayısıyla tüm çıktı tek bir dosya adı olarak ele alınacak ve bu da gördüğünüz hatayı alacaktır.

Neyse, find kullanarak öneririm: Eğer du zaten istediğiniz ve bunun yerine kullanmak istediğiniz çıktıyı üreten olduğunu memnunsanız

find /path/to/source -type d -size -1024M -exec mv -it /path/to/destination {} + 

, sen -0 anahtarı ekleyebilirsiniz böylece null byte separators kullanır, o zaman geçerli xargs komutunuz çalışmalıdır.

+0

Teşekkürler :) Ne yazık ki tamamen elde edemiyorum Benim iradesine eğilmek. Çıkışı kontrol etmek için her şeyi -exec'ten önce çalıştırırsam, -type d 'işaretini görmezden gelir ve her dosyayı 1024M'den az çıkarır. – nimrag

+0

Belki de '-0' anahtarını' du'ya ekleyebilirsiniz (güncellememe bakın). –

+0

Şimdi gerçekten yaklaşıyoruz! Tek sorun şu ki, 'du', 'mv' ye pipetlenen dir boyutlarının çıktısını alıyor ve açıkça 'mv' artık dir isimlerini tanımıyor. – nimrag