Memindahkan serangkaian file bernomor?

14

Saya punya 291 file bernomor (mulai dari 001 - judul dan berakhir pada 291 - judul) yang perlu dipindahkan ke direktori terpisah. (001 hingga 021 ke folder 1, 022 hingga 053 ke folder 2, mereka tidak selalu memiliki jumlah file yang sama setiap kali).

Saya pikir saya bisa melakukannya dengan cara yucky seperti ini: ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

Saya hampir yakin ada cara yang lebih baik, jadi apa itu?

EDIT: Jadi itu akan bekerja dengan baik, tapi saya ingat ...

Saya tidak terjebak menggunakan terminal, jadi saya menggunakan file manager untuk mengklik dan menarik. Pertanyaan masih berdiri.

rampok
sumber
1
Anda ingin 21 subfolder di folder 1, dan 22 folder di folder 2?
Daniel Beck
Sudahkah Anda meninjau unix.SE? Ada untaian yang bagus tentang ini di sini: unix.stackexchange.com/questions/12976/...
chrisjlee
@DanielBeck tidak, saya ingin file pindah ke setiap folder. Ada sejumlah file yang berbeda untuk setiap folder.
Rob
@ ChrisJ.Lee Itu sangat mirip dengan apa yang saya lakukan / lakukan sebelumnya, saya menyukainya. Karena file cocok dengan file lain di folder lain, saya bisa ls -l | grep ^- | wc -lmendapatkan jumlah garis.
Rob
1
@Rob Benar. Meski demikian, jumlah file berbeda ke dalam setiap direktori. Mengotomatiskan itu (termasuk aturan) adalah upaya lebih dari melakukannya sendiri beberapa kali.
Daniel Beck

Jawaban:

25

Karena Anda mengatakan itu tidak selalu tepat 21 file daripada yang Anda butuhkan untuk memindahkan file secara manual, dan untuk melakukannya secara efektif Anda bisa menggunakan ekspansi brace :

mv filename{001..21} dir1
mv filename{022..53} dir2
...
drrlvn
sumber
Sepertinya ini bisa berhasil, saya akan mencobanya.
Rob
1
Ini berfungsi dengan baik, jika Anda menambahkan wildcard setelah tanda kurung. Inilah yang saya butuhkan.
Rob
2
Jika nomornya ada di tengah nama, Anda dapat menulis file{001..21}name, Anda tidak harus menggunakan wildcard. Bagaimanapun, senang itu berhasil untuk Anda.
drrlvn
1

Ini akan memindahkan file seperti yang Anda gambarkan (kecuali bahwa rentang kedua adalah 022 hingga 042 untuk 21 file kedua).

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
Dijeda sampai pemberitahuan lebih lanjut.
sumber
Tidak selalu 21 file, tapi terima kasih.
Rob
0

Yang saya maksud adalah memindahkan banyak file (seperti sepuluh ribu atau jutaan), shell akan mengeluh tentang daftar file terlalu lama jika Anda hanya menggunakan {1..20}, jadi

Di zsh , Anda dapat memuat mv builtin:

setopt extended_glob zmodload

zsh / file

setelah melakukan itu, Anda dapat menggunakan perintah seperti:

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

atau jika Anda menulis beberapa skrip shell, Anda dapat melakukan sesuatu seperti ini:

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

jika Anda tidak menggunakan zsh, Anda dapat merujuk ke /unix/128559/solving-mv-argument-list-too-long

Arron Cao
sumber
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah. Jawaban mana yang Anda referensikan sebagai "jawaban yang lebih terperinci"?
Ramhound
Ini tidak benar-benar menjawab pertanyaan karena OP ingin memindahkan file yang berbeda ke direktori yang berbeda.
DavidPostill