Saya mencoba menjalankan rsync untuk menyalin beberapa file secara rekursif ke jalur berdasarkan pola nama file mereka, case- sensitive . Inilah yang telah saya lakukan untuk menjalankan rsync:
$ rsync -avvz --include ='*/' --include='.*[Nn][Aa][Mm][E].*' --exclude='*' ./a/ ./b/
Tidak ada yang disalin, hasil debug menunjukkan:
[sender] hiding file 1Name.txt because of pattern *
[sender] hiding file 1.txt because of pattern *
[sender] hiding file 2.txt because of pattern *
[sender] hiding file Name1.txt because of pattern *
[sender] hiding directory test1 because of pattern *
[sender] hiding file NaMe.txt because of pattern *
Saya telah mencoba menggunakan: --include='*[Nn][Aa][Mm][E]*'
dan kombinasi lainnya tetapi tetap tidak berhasil.
Adakah ide tentang cara menggunakan regex untuk memasukkan beberapa file?
--exclude='*'
?Jawaban:
rsync tidak berbicara regex. Anda dapat meminta find dan grep, meskipun mendapat sedikit rahasia. Untuk menemukan file target:
Tetapi mereka semua diawali dengan "a /" - yang masuk akal, tetapi yang ingin kita akhiri adalah daftar pola sertakan yang dapat diterima oleh rsync, dan karena awalan "a /" tidak berfungsi untuk rsync I ' akan menghapusnya dengan memotong:
Masih ada masalah - kami masih akan kehilangan file di subdirektori, karena rsync tidak mencari direktori dalam daftar pengecualian. Saya akan menggunakan awk untuk menambahkan subdirektori dari semua file yang cocok ke daftar pola sertakan:
Yang tersisa adalah mengirim daftar ke rsync - kita dapat menggunakan argumen --include-from = - untuk memberikan daftar pola ke rsync pada input standar. Jadi, semuanya:
Perhatikan bahwa direktori sumber 'a' dirujuk melalui dua jalur berbeda - "a /" dan "./a/". Ini halus tetapi penting. Untuk membuat semuanya lebih konsisten, saya akan membuat satu perubahan terakhir, dan selalu merujuk ke direktori sumber sebagai "./a/". Namun, ini berarti perintah cut harus diubah karena akan ada tambahan "./" di bagian depan hasil dari find:
sumber
-t
adalah saklar yang valid.sed "s#^$1/*##"
buuuut yang akan merusak jalur yang berisi #. Untuk memperbaikinya kita harus mengutip nama direktori yang masuk:prefix=$(echo "$1" | sed 's#/#\\/#g')
dan kemudiansed "s/^$prefix\\/*//"
The subleties dari bash quoting sedikit mimpi buruk;)Saya akan menyarankan untuk menggunakan opsi filter rsync. Misalnya, ketikkan saja:
aturan filter pertama memberitahu rsync pola apa yang akan dimasukkan. Aturan kedua diperlukan untuk memberitahu rsync untuk memeriksa semua direktori pada traversal-nya. Untuk mencegah dir kosong dari inklusi mereka dikeluarkan secara eksplisit oleh
-m
opsi. Aturan filter terakhir memberitahu rsync untuk membuang semua pola yang tersisa yang masih belum cocok sejauh ini.sumber
Jika Anda menggunakan ZSH maka Anda dapat menggunakan flag (#i) untuk mematikan sensitivitas case. Contoh:
ZSH juga mendukung pengecualian, yang ditentukan seperti jalur biasa tetapi mereka memiliki inisial ~
Anda dapat membuat pengecualian:
Akhirnya Anda dapat menentukan jenis file apa yang ingin Anda kembalikan (direktori, file, dll). Ini dilakukan dengan (/) untuk direktori dan (.) Untuk file.
Berdasarkan semua ini, saya akan melakukan perintah itu sebagai:
(Saya tidak melihat perlunya pengecualian dengan pemilih ini)
sumber
@ sqweek jawaban di atas luar biasa, meskipun saya curiga ia memiliki bug dalam
awk
skripnya untuk membuat direktori induk, karena itu memberi saya misalnya:Saya bisa memperbaikinya dengan menggunakan
gensub
:Jadi, solusi lengkapnya, dengan
awk
sedikit perubahan, adalah:sumber
sub("/[^/]*$")
).Dicoba dengan skrip C # karena ini adalah bahasa yang paling banyak saya alami. Saya dapat membuat daftar file yang ingin saya sertakan, tetapi seseorang rsync masih memberitahu saya untuk mendaki. Itu membuat folder, tetapi mengabaikan file. Inilah yang saya dapatkan ..
Pertama isi direktori:
Maka output dari skrip C #:
Dan hasil debug:
sumber
[EDIT] Ini hanya berfungsi secara lokal. Untuk jalur jarak jauh, struktur direktori harus dibuat terlebih dahulu.
Lebih sederhana dari pada jawaban yang diterima; Gunakan --file-from, yang meliputi direktori induk secara otomatis dan printf path file dengan% P
Jadi, Anda hanya perlu menggunakan
find
danrsync
.sumber