İlk x dosyası nasıl taşınır


21

Binlerce sıralanmamış dosya içeren bu büyük klasöre sahibim. İlk 5000'leri komutla bir alt klasöre taşımak mümkün müdür mv? Şimdilik dosyaları

 mv *some_pattern* ./subfolder1/

Şimdiye kadar, görüntüleri oldukça rastgele hareket ettiriyorum, her alt klasörde tam olarak 5000 dosya yoksa gerçekten önemli değil. Bunu yapmanın daha iyi bir yolu var mı?


Yanıtlar:


23
mv `ls | head -500` ./subfolder1/

12
(dosya adlarının hiçbirinin boşluk, sekme, yeni satır, yıldız, açık köşeli ayraç, soru işareti karakterleri içermesi -veya kendisiyle başlaması veya bu listede görünmemesi .varsayılarak subfolder1).
Stéphane Chazelas

@ StéphaneChazelas dosya bunları içeriyorsa, komutu nasıl değiştiririz?
Peiti Li

$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
Brian Thomas

15

İle zsh:

mv -- *(D.oN[1,5000]) ./subfolder1

En fazla 5000 normal dosyayı dizinde bulundukları sırayla taşımak için.

Sözlükbilimsel olarak sıralanmış listedeki ilk 5000 için:

mv -- *(D.[1,5000]) ./subfolder1

Arg listesi hakkında çok uzun bir hata alırsanız . Sen kullanabilirsiniz zshbuitin s' mvdüzenlenmek suretiyle komutu:

zmodload zsh/files

ilk.

POSIXly:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/

2
POSIX snippet bir mücevher
iruvar

bash kullanarak hata alırsam ne olur?
Brian Thomas

8

Basit ve özel karakterleri, boşlukları vb. Destekleyen bir sürüm.

ls -Q dir1 | head -1000 | xargs -i mv dir1/{} dir2/

Bu işlemin gerçekleşmesi için as-olduğunu dir2bulunması gerekir ve siz ana dizinden çalıştırmak zorunda dir1ve dir2.

Bu işlem 1000 dosyayı dir1'den dir2'ye taşır.


güzel! ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/ 1000 en büyük dosyayı
dir1'de

1
Bunun beklenen girdi biçimiyle ls -Quyumlu bir çıktı üretmediğini unutmayın xargs. Boşluk karakterleri içeren dosya adlarına yardımcı olur, ancak çift tırnak işaretleri veya ters eğik çizgiler ve TAB dahil kontrol karakterleri içeren dosya adları için zarar verir.
Stéphane Chazelas

3

Bunun gibi bir şey yapmanız gerekebilir:

x=1
for file in *
do
    if [ "X$x" = "X#####" ]; then
        break
    fi
    mv $file <destination>
    x=`expr $x + 1`
done

Bu komut dosyası bash, ksh, sh ve birden çok UNIX varyantında çalışır.


1
(dosya adlarının hiçbirinde boşluk, sekme, yeni satır, yıldız, açık köşeli ayraç, soru işareti karakterleri bulunmaması veya - veya ile başlamaması ve destinationkendisinin bu listede
görünmemesi şartıyla

@StephaneChazelas True. Bu tam bir çözüm değil, sadece problemle başa çıkma yöntemi.
Karlson

3
  1. Dosyaları taşımak istediğiniz dizine gidin
  2. aşağıdaki komutu çalıştır

    find . -name 'Hello*.gz' | head -n 5000 | xargs -I {} mv {} /data01/path/ 

In findkomutu .(nokta) geçerli dizini gösterir

Hello ile başlayan ve gz ile biten dosyaları bulur, ilk 5000 dosya yola taşınacaktır /data01/path/


1

Böyle mv bash hatası olmadan 50.000 hamleyi başarılı bir şekilde yapabildim

 ls | head -50000 | xargs -I{} sudo mv {} 01/

Yeterince komik, bu bir samba paylaşımındaydı, bu yüzden 50k sınırı, Windows Gezgini GUI'sinin genel olarak bir dizde 60 binden fazla dosyayı sevmemesidir.

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.