Misalkan ada direktori yang menyimpan 300 file data. Saya ingin secara acak memilih 200 dari file-file itu dan memindahkannya ke direktori lain. Apakah ada cara untuk melakukan itu di bawah Unix / Linux?
linux
shell
command-line
filesystems
directory
pertanyaan kecil
sumber
sumber
list.files()
...shuf
danhead
(atau hanya menggunakanshuf -n
, seharusnya membaca halaman manual ...)Jawaban:
Jika sistem Anda memiliki
shuf
, Anda dapat menggunakan ini dengan mudah (bahkan menangani nama file yang jelek):Jika Anda tidak memiliki
shuf
tetapi memilikisort
yang dibutuhkan-R
, ini harus bekerja:sumber
shuf
tidak dipanggiltros
karena melakukan kebalikan dari penyortiran.)sumber
Masukkan semua nama file ke dalam array bernama "file" di bash:
ukuran array:
tentukan 2/3 dari mereka sebagai ukuran sampel:
Ini akan pilih duplikat, dan yang
tidakdiuji dengan nama file dengan kosong dan semacamnya.Cara paling sederhana untuk menghindari duplikat adalah, untuk mengulangi semua file, dan memilih masing-masing dengan peluang 2/3, tetapi ini tidak akan menyebabkan 200 file.
Ini akan menghapus file jika dipilih dari daftar dan memenuhi persyaratan Anda:
sumber
$RANDOM
hanya dapat memiliki nilai 0 hingga 32767, jadi ini tidak akan berfungsi dengan baik jika Anda memiliki lebih dari 32768 file. Juga, mengambil bias terhadap file pertama.Jika ini perlu acak secara statistik, Anda tidak boleh menggunakannya
RANDOM % ${#keys[@]}
. Mempertimbangkan:$RANDOM
memiliki 32768 nilai unikJadi, ketika memilih item pertama, ada peluang 110/32768 ~ = 0,33569% untuk masing-masing dari 68 elemen pertama, dan 109/32768 ~ = 0,33264% peluang untuk masing-masing dari 232 elemen lainnya untuk dipilih. Pemetikan diulang beberapa kali dengan peluang berbeda, tetapi bias terhadap elemen pertama setiap kali
32768 % ${#keys[@]} -ne 0
, sehingga kesalahan bertambah.Ini harus tidak bias , dan berfungsi dengan nama file apa pun:
sumber
Solusi Kevin bekerja sangat baik! Hal lain yang sering saya gunakan karena merasa lebih mudah untuk mengingat dari atas kepala saya adalah sesuatu seperti:
sumber
Satu liner dalam bash:
sumber