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.sh
dengan 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.
linux
command-line
bash
shell
Frederick Löbig
sumber
sumber
set -x
ke awal skrip Anda dan lihat apakah itu.Jawaban:
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: -
mv
Sintaks yang salah ?Dari skrip, baris berikut tidak melakukan apa pun:
Saya tidak yakin apakah saya bisa menggunakan parameter standar
mv
saat memanggilnya dari-exec
, tetapi saya menambahkan-f
parameter untuk menimpa file yang ada di direktori target.Dengan menambahkan
set -x
ke skrip seperti yang disarankan, itu memberi saya pesan kesalahan kembali mengatakan ada yang salah dengan argumenmv
perintah. Jadi saya menghapus-f
parameternya. Tanpa keberhasilan. Setelah googling sedikit lebih jauh dan melihat beberapa contoh yang semuanya menggunakan-t
parameter, 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:(perhatikan yang dipindahkan
{}
). Tapi saat ini masalah tersebut masih belum terselesaikan dan saya bahkan tidak yakin apakah-f
dan-t
yang 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 dinamaiMOBIDICDATA
. 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:
... yang berhasil.
Bagi saya ini sedikit Odysee.
Ringkasan
Ya, parameter
-t
/-f
itu 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:
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.
sumber
2>/dev/null
kebetulan?-t
argumen darimv
berguna untuk setidaknya dua alasan: (1) Ia memberi tahumv
path target harus direktori, bukan nama file. Bandingkanmv a b
,mv a -t b
danmv a b/
kapana
ada danb
tidak. (2) Ini memungkinkan Anda untuk menggunakanfind … -exec mv -t … {} +
sintaks yang dapat memindahkan banyak file dengan satumv
proses tetapi{}
harus tepat sebelum mengakhiri+
, sehinggamv
sintaksis biasa (di mana direktori target adalah argumen terakhir) tidak dapat digunakan.