Bir dizi numaralandırılmış dosya taşınsın mı?


14

Ayrı dizinlere taşınması gereken 291 numaralı dosya (001 - başlık ve 291 - başlık ile biten) var. (001 ila 021 klasör 1, 022 ila 053 klasör 2, her seferinde aynı sayıda dosya olması gerekmez).

Böyle yucky bir şekilde yapabileceğimi düşündüm: ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

Neredeyse daha iyi bir yol olduğunu düşünüyorum, bu ne olurdu?

EDIT: Böylece iyi çalışır, ama hatırladım ...

Bir terminal kullanarak sıkışıp kalmadım, bu yüzden tıklayıp sürüklemek için bir dosya yöneticisi kullandım. Soru yine de duruyor.


1
Klasör 1'de 21 alt klasör ve klasör 2'de 22 klasör ister misiniz?
Daniel Beck

Unix.SE'yi incelediniz mi? Burada iyi bir iş parçacığı var: unix.stackexchange.com/questions/12976/…
chrisjlee

@DanielBeck no, dosyaların her klasöre taşınmasını istiyorum. Her bir klasöre giden farklı sayıda dosya vardır.
Rob

@ ChrisJ.Lee Daha önce yaptığım / yaptığımla oldukça benzer, hoşuma gitti. Dosyalar başka bir klasördeki diğer dosyalarla eşleştiği ls -l | grep ^- | wc -liçin satır sayısını alabilirim.
Rob

1
@ Doğru. Yine de, her dizine farklı sayıda dosya. Bunu (kurallar dahil) otomatikleştirmek, bunu birkaç kez yapmaktan daha fazla çaba gerektirir.
Daniel Beck

Yanıtlar:


25

Her zaman tam olarak 21 dosya olmadığını söylediğiniz için, dosyaları manuel olarak taşımanız gerekir ve bunu etkili bir şekilde yapmak için ayraç genişletmeyi kullanabilirsiniz :

mv filename{001..21} dir1
mv filename{022..53} dir2
...

Bu işe yarayabilir gibi görünüyor, ben deneyeceğim.
Rob

1
Köşeli parantezlerin arkasına bir joker karakter eklerseniz bu mükemmel bir şekilde çalışır. Tam da ihtiyacım olan şey bu.
Rob

2
Sayı adın ortasındaysa, yazabilirsiniz file{001..21}name, joker karakter kullanmanız gerekmez. Her neyse, mutlu senin için çalıştı.
drrlvn

1

Bu, dosyaları tanımladığınız şekilde taşıyacaktır (ikinci aralığın ikinci 21 dosya için 022 ila 042 olması dışında).

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done

Her zaman 21 dosya değil, teşekkürler.
Rob

0

Demek istediğim çok fazla dosya taşımak (on binlerce veya bir milyon gibi), kabuk sadece {1..20} kullanırsanız dosya listesi hakkında çok uzun süre şikayet edecek, yani

In zsh , sen yükleyebilirsiniz mv yerleşiğini:

setopt extended_glob zmodload

zsh / dosyaları

bunu yaptıktan sonra aşağıdaki gibi komutları kullanabilirsiniz:

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

veya bazı kabuk komut dosyaları yazıyorsanız, böyle bir şey yapabilirsiniz:

for i in `seq $start $end`;  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

zsh kullanmıyorsanız, /unix/128559/solving-mv-argument-list-too-long adresine başvurabilirsiniz.


Bu bağlantı soruyu cevaplayabilse de, cevabın önemli kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir. Hangi cevabı "daha ayrıntılı cevap" olarak adlandırıyorsunuz?
Ramhound

OP farklı dosyaları farklı dizinlere taşımak istediği için bu soruya gerçekten cevap vermiyor.
DavidPostill
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.