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?


Jawaban:


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

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/

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.


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.


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/


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.