mv dalam skrip shell tidak memindahkan file

1

Sayangnya, sering dibahas, namun jawabannya tidak membuat saya mendapatkan solusi, dan saya agak malu bahwa saya perlu menanyakan pertanyaan ini lagi. Tapi, ini dia.

Saya memiliki skrip shell dosomething.shdengan shebang #!/bin/bash.

Di dalam skrip ini saya memiliki baris berikut untuk menyalin file dari tipe tertentu dari satu direktori ke yang lain:

find "/var/www/analysis_xyz/" -name '*log.gz' -exec mv -f {} "/media/pi/MOBIDICDATA" \;

Ketika skrip dieksekusi, tidak ada yang disalin. Saya yakin ini hanya hal kecil yang saya lewatkan. Pertanyaannya adalah: apa?


Pertanyaan itu sendiri mungkin tampak luas, tetapi harap dicatat saya telah memposting jawaban saya sendiri yang memecahkan masalah. Saya pikir ada nilai pendidikan yang cukup dalam studi kasus ini untuk membuatnya bermanfaat bagi masyarakat.

Frederick Löbig
sumber
1
Apakah ini kode literal yang digunakan dalam skrip, yaitu tidak ada ekspansi variabel, struktur kontrol dll?
Melebius
1
Mungkin baris ini tidak pernah dieksekusi. Tambahkan a set -xke awal skrip Anda dan lihat apakah itu.
Gerard H. Pille
@ GerardH.Pille Saya akan coba ini ...
Frederick Löbig
@ GerardH.Pille Terima kasih atas petunjuknya! Saya tidak tahu bahwa jika saya menambahkan set -x saya benar-benar akan melihat hasilnya. Saya akan menjawab dengan apa yang salah.
Frederick Löbig
Saya telah mengedit jawaban sebelumnya.
Frederick Löbig

Jawaban:

0

Berkat komentar-posternya, saya bisa menyelesaikan masalah ini. Ini adalah versi yang diedit dari jawaban saya sebelumnya karena ternyata tidak cukup sama sekali dan menimbulkan lebih banyak pertanyaan daripada yang dijawab.

Jadi di sini saya mencoba menggambarkan setiap masalah yang menyebabkan masalah itu sendiri dan bagaimana saya menyelesaikannya.


Percobaan # 1: - mvSintaks yang salah ?

Dari skrip, baris berikut tidak melakukan apa pun:

find "/var/www/analysis_xyz/" -name '*log.gz' -exec mv -f {} "/media/pi/MOBIDICDATA" \;

Saya tidak yakin apakah saya bisa menggunakan parameter standar mvsaat memanggilnya dari -exec, tetapi saya menambahkan -fparameter untuk menimpa file yang ada di direktori target.

Dengan menambahkan set -xke skrip seperti yang disarankan, itu memberi saya pesan kesalahan kembali mengatakan ada yang salah dengan argumen mvperintah. Jadi saya menghapus -fparameternya. Tanpa keberhasilan. Setelah googling sedikit lebih jauh dan melihat beberapa contoh yang semuanya menggunakan -tparameter, jadi saya menambahkannya. Sekali lagi, tidak berhasil, sebaliknya saya mendapat pesan kesalahan yang mengatakan, bahwa sebuah direktori diharapkan yang saya artikan salah (maaf, sedikit noob tentang skrip shell). Saat ini saya memiliki sintaks berikut, yang ternyata kemudian benar-benar benar dan berfungsi:

find /var/www/analysis_xyz/ -name '*log.gz' -exec mv {} -t /media/pi/MOBIDICDATA \;

(perhatikan yang dipindahkan {}). Tapi saat ini masalah tersebut masih belum terselesaikan dan saya bahkan tidak yakin apakah -fdan -tyang bagian itu.


Percobaan # 2: - Apakah saya mencoba menulis ke USB-stick yang terpasang hanya baca?

Seperti yang mungkin telah Anda perhatikan, folder targetnya adalah /media/pi/…Jadi Anda mungkin sadar bahwa saya menggunakan Raspberry Pi dan saya menggunakan Raspbian. Stik USB yang saya inginkan untuk menulis data di-mount secara otomatis ke folder ini (selama perangkat dinamai MOBIDICDATA. Mount otomatis memasang perangkat sebagai read-only (dan pada saat ini saya tidak tahu mengapa). proses yang akan dieksekusi, tetapi tidak ada file yang disalin dan pesan kesalahan muncul mengatakan perangkat itu hanya-baca.

Saya memutuskan untuk tidak mengandalkan pemasangan otomatis dan pemasangan perangkat sendiri saat reboot ke lokasi lain. Target baru adalah /mobidicdata. Perangkat berhasil dipasang, tetapi masih hanya untuk alasan tertentu.


Mencoba # 3: - Apakah hidup singkat untuk menghapus USB dengan aman?

Di masa lalu saya benar-benar membunuh 2 perangkat USB dengan menghapusnya dengan aman dari PC windows jadi saya memutuskan untuk tidak melakukan ini lagi, karena saya tidak pernah membunuh perangkat dengan hanya menariknya keluar. Sedikit yang saya tahu bahwa misalnya USB stick, yang hanya ditarik keluar selalu dipasang sebagai read-only pada sebagian besar sistem non-Windows; yang masuk akal karena sistem file mungkin rusak dan menyebabkan masalah lain. Setelah mengetahui hal ini, saya melepas perangkat USB dengan aman, memasangnya, dan sekarang r / w.

Jadi, uji lagi dengan perangkat yang dapat ditulis dan sintaks berikut:

find /var/www/analysis_xyz/ -name '*log.gz' -exec mv {} -t /mobidicdata \;

... yang berhasil.

Bagi saya ini sedikit Odysee.


Ringkasan

Ya, parameter -t/ -fitu bukan masalah seperti yang disebutkan sebelumnya. Itu lebih dari multi-masalah-cluster yang seharusnya saya jelaskan secara lebih rinci sebelumnya.

Saya berharap dapat menjelaskan semuanya dan apa yang saya tahu mulai sekarang dan akan dilakukan di masa depan:

  • Anda harus menghapus USB dengan aman

Sayangnya saya tidak dapat sepenuhnya mereproduksi masalah di atas. Dalam hal ini saya bisa menyatakan pesan kesalahan yang tepat. Tetapi saya masih berpikir bahwa ini memberikan sedikit lebih banyak wawasan tentang apa yang terjadi dan apa yang dilakukan.

Frederick Löbig
sumber
1
Aneh, saya tidak mengerti mengapa -f akan menyebabkan mv gagal. Jika demikian, maka akan ada pesan kesalahan. Anda tidak mengakhiri garis itu dengan 2>/dev/nullkebetulan?
Gerard H. Pille
1
@KamilMaciorowski juga, hanya mengganti "-f" dengan "-t" yang seharusnya membuat kesalahan: "-t" harus diikuti oleh nama direktori.
Gerard H. Pille
Maaf bila membingungkan. Saya akan menjelaskan rincian lebih lanjut besok ketika saya kembali ke kantor.
Frederick Löbig
Oke, sekarang untuk detail lebih lanjut. Ternyata, memang tidak semudah yang dijelaskan dalam jawaban, karena ada beberapa masalah yang menyebabkan perilaku yang agak aneh. Jadi saya akan mengirim jawaban lain yang menjelaskan dengan tepat apa yang telah saya lakukan dan apa masalahnya.
Frederick Löbig
-targumen dari mvberguna untuk setidaknya dua alasan: (1) Ia memberi tahu mvpath target harus direktori, bukan nama file. Bandingkan mv a b, mv a -t bdan mv a b/kapan aada dan btidak. (2) Ini memungkinkan Anda untuk menggunakan find … -exec mv -t … {} +sintaks yang dapat memindahkan banyak file dengan satu mvproses tetapi {}harus tepat sebelum mengakhiri +, sehingga mvsintaksis biasa (di mana direktori target adalah argumen terakhir) tidak dapat digunakan.
Kamil Maciorowski