Cara memindahkan file x pertama

21

Saya memiliki folder besar ini dengan ribuan file tidak terurut. Apakah layak memindahkan 5000 pertama ke subfolder melalui mvperintah? Untuk sekarang saya memindahkan file dengan

 mv *some_pattern* ./subfolder1/

Sedangkan untuk sekarang, saya memindahkan gambar secara acak, itu tidak terlalu penting jika tidak ada 5000 file di setiap subfolder. Apakah ada cara yang lebih baik untuk melakukannya?

Hebat
sumber
Lihat juga Mendistribusikan ribuan file melalui subfolder
Stéphane Chazelas

Jawaban:

23
mv `ls | head -500` ./subfolder1/
schaiba
sumber
12
(dengan asumsi tidak ada nama file yang mengandung spasi, tab, baris baru, bintang, tanda kurung kotak terbuka, karakter tanda tanya atau mulai dengan -atau .dan dengan asumsi subfolder1itu sendiri tidak muncul dalam daftar itu.)
Stéphane Chazelas
@ StéphaneChazelas jika file berisi itu, bagaimana kita memodifikasi perintah?
Peiti Li
$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
Brian Thomas
15

Dengan zsh:

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

Untuk memindahkan hingga 5.000 file biasa sesuai urutannya dalam direktori.

Untuk 5000 pertama dalam daftar yang diurutkan secara leksikografis:

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

Jika Anda mendapatkan kesalahan tentang daftar arg terlalu lama . Anda dapat menggunakan perintah zshbuitin mvdengan mengeluarkan:

zmodload zsh/files

pertama.

POSIXly:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/
Stéphane Chazelas
sumber
2
Cuplikan POSIX adalah permata
iruvar
bagaimana jika saya mendapatkan kesalahan menggunakan bash?
Brian Thomas
8

Versi yang sederhana dan mendukung karakter khusus, spasi, dll.

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

Agar ini berfungsi sebagaimana adanya dir2harus ada dan Anda harus menjalankannya dari direktori induk dari dir1dan dir2.

Ini akan memindahkan 1000 file dari dir1 ke dir2.

Luis Antolín Cano
sumber
bagus ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/ untuk memindahkan 1000 file terbesar dalam dir1 (-S mencantumkan file dengan ukuran)
oneklc
1
Catatan yang ls -Qtidak menghasilkan output yang kompatibel dengan xargsformat input yang diharapkan. Ini membantu untuk nama file yang mengandung karakter spasi, tetapi tidak untuk tanda kutip ganda atau garis miring terbalik dan bahaya untuk nama file yang mengandung karakter kontrol termasuk TAB.
Stéphane Chazelas
3

Anda mungkin perlu melakukan sesuatu seperti ini:

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

Skrip ini berfungsi dalam bash, ksh, sh, dan beberapa varian UNIX.

Karlson
sumber
1
(asalkan tidak ada nama file yang mengandung spasi, tab, baris baru, bintang, braket kotak terbuka, karakter tanda tanya atau mulai dengan - atau. dan disediakan destinationsendiri tidak muncul dalam daftar itu.)
Stéphane Chazelas
@StephaneChazelas Benar. Ini bukan solusi lengkap hanya metode untuk mengatasi masalah.
Karlson
3
  1. Masuk ke direktori tempat Anda ingin memindahkan file
  2. jalankan perintah di bawah ini

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

Dalam findperintah, .(titik) menunjukkan direktori saat ini

menemukan file yang dimulai dengan Hello dan diakhiri dengan gz, 5000 file pertama akan dipindahkan ke jalan /data01/path/

Pratik Hiremath
sumber
1

Saya berhasil melakukan langkah 50.000 tanpa kesalahan mv bash seperti ini

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

Cukup lucu, ini ada di samba share, jadi batas 50k adalah karena Windows Explorer GUI tidak suka lebih dari 60k file dalam direktori secara umum.

Brian Thomas
sumber