Saya memiliki jutaan file dengan nomenklatur berikut di mesin Linux:
1559704165_a1ac6f55fef555ee.jpg
10 digit pertama adalah cap waktu dan yang diikuti oleh _
adalah id khusus. Saya ingin memindahkan semua file yang cocok dengan id nama file tertentu ke folder yang berbeda.
Saya mencoba ini pada direktori dengan file
find . -maxdepth 1 -type f | ??????????_a1ac*.jpg |xargs mv -t "/home/ubuntu/ntest"
Namun saya mendapatkan kesalahan yang menunjukkan:
bash 1559704165_a1ac6f55fef555ee.jpg: command not found
Ketika saya mencoba, mv ??????????_a1ac*.jpg
saya mendapatkan daftar argumen kesalahan terlalu lama. Saya memiliki minimal 15 pola nama file yang berbeda. Bagaimana cara memindahkan mereka.
| ??????????_a1ac*.jpg
:: bash memperluasnya ke beberapa nama file, yang pertama1559704165_a1ac6f55fef555ee.jpg
, saat Anda berakhir , pada tahap ke-2 pipa itu, mencoba mengeksekusi:1559704165_a1ac6f55fef555ee.jpg next_matching_filename 3rd_matching_filename ... nth_matching_filename
Saya kira Anda malah mencoba memfilter ke nama file itu (lihat jawaban di bawah untuk itu)Jawaban:
Kamu harus menggunakan:
Jadi
maxdepth 1
artinya Anda ingin mencari di direktori saat ini tanpa subdirektori.type f
berarti hanya menemukan file.name '??????????_a1ac*.jpg'
adalah pola yang cocok dengan file yang Anda cari.mv -t destination "{}" +
berarti memindahkan file yang cocok ke tujuan. Di sini+
menambahkan file-file baru yang cocok ke yang sebelumnya seperti:Di sini abcd adalah file yang berbeda.
sumber
-t
adalah ekstensi GNU dan mungkin tidak tersedia pada jenis turunan UNIX lainnya."{}"
, dalam hal ini saya ingin menunjukkan bahwa{}
tidak diperluas oleh shell dan tidak perlu dikutip. Shell melewati{}
untuk menemukan, dan menemukan melihat{}
dan menggantinya dengan nama path. Find exec tidak menggunakan parser shell dan tidak melakukan pemisahan kata sendiri. Mengutip itu tidak membahayakan, hanya saja justifikasi yang diberikan sedikit tidak akurat.Perintahmu,
Pipa daftar semua file KE semua file!
akan melakukan trik.
sumber
Anda sangat dekat. Anda harus menggunakan
-name
opsi untukfind
. Dan ingatlah untuk mengutip polanya.Begitu
sumber
-print0
sebagai argumen terakhir ke find (bukan default: -print), dan menambahkan a-0
sebagai opsi pertama ke xargs (yaitu:)xargs -0 mv -t "/home/ubuntu/ntest"
. dengan cara itu, semua jenis nama file aneh (dengan spasi di dalamnya, dengan "baris baru" di dalamnya, dll) dapat ditangani.find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' -print0 |xargs -0 mv -t "/home/ubuntu/ntest"
(hanya bekerja dengan find mirip GNU)Tidak sebagus
find
solusi, tetapi solusi lain yang valid adalah membuatmv
perintah lebih terperinci.Ini tidak 4096 bergerak, dengan lebih sedikit jumlah file dipindahkan per
mv
operasi.sumber
find
(karena alasan apa pun).Jika Anda ingin memindahkan file pada sistem host yang sama, yang saya kira Anda lakukan dengan Anda
mv
,rsync
bisa menjadi pilihan yang lebih cepat:--inplace
dan-W
diatur untuk mempercepat proses.Jika ini menghasilkan daftar argumen lain yang terlalu panjang maka Anda bisa memberi makan daftar
rsync
Buat daftar dengan find, misalnya
dan berikan kepada
rsync
Sumbernya di sini adalah
/path/to/files
, karenarsync
akan memperlakukan daftar yang Anda berikan sebagai relatif terhadap sumber Anda.Intinya adalah:
rsync
lebih cepat daripadamv
, jika file tidak pada sistem file yang sama .sumber
find . -maxdepth 1 -type f -name '??????????_a1ac*.jpg' > /tmp/my_image_list.txt
dan kemudian meneruskannya ke rsync dengan--files-from=/tmp/my_image_list.txt
. Intinyarsync
adalah lebih cepat. Kecuali jika file-file tersebut berada pada sistem file yang sama, yang belum ditunjukkan OP.