Saya memiliki skrip bash untuk menyebarkan kode dari lingkungan beta ke lingkungan produksi tetapi saat ini saya harus menambahkan daftar file ke file txt manaully dan kadang-kadang saya melewatkan beberapa. Pada dasarnya script deployment saya cat / loop menyalin file. (ekspor / impor db juga tapi itu tidak relevan..lol)
Bagaimanapun, saya ingin menggunakan find
perintah untuk menghasilkan daftar file yang dimodifikasi dalam 14 hari terakhir. Masalahnya adalah saya harus menghapus jalur ./
agar skrip penerapan berfungsi.
Berikut adalah contoh penggunaan perintah find:
temukan. -type f -mtime -14> deploy.txt
Inilah baris yang digunakan kucing deploy.txt
dalam skrip penerapan saya:
for i in `cat deploy.txt`; do cp -i /home/user/beta/public_html/$i /home/user/public_html/$i; done
Adakah cara untuk mencapai hal ini menggunakan bash scripting?
Terima kasih!
--dry-run
mode dan output itu ke file untuk ditinjau?Jawaban:
Anda dapat menggunakan
-printf
opsi baris perintah dengan%f
untuk mencetak hanya nama file tanpa informasi direktoriatau Anda dapat menggunakan sed untuk menghapus ./
sumber
/.
.|
sebagai pembatas.%f
akan menghapus semua direktori, bukan hanya./
. Ini akan merusak skrip penerapannya jika ada file yang dikembalikan olehfind
terletak di subdirektori..
. Dan mungkin yang terbaik untuk menggunakan jangkar awal:s|^\./||
%P
sebagai ganti%f
. Ini hanya memotong jalur yang diberikan di baris perintah.The
./
harus tidak berbahaya. Sebagian besar program akan memperlakukan/foo/bar
dan/foo/./bar
setara. Saya menyadari itu tidak terlihat sangat bagus, tetapi berdasarkan apa yang Anda posting, saya tidak melihat alasan mengapa itu akan menyebabkan skrip Anda gagal.Jika Anda benar-benar ingin menanggalkannya,
sed
mungkin ini adalah cara terbersih:Jika Anda menggunakan sistem dengan GNU find (mis. Kebanyakan sistem Linux), Anda dapat melakukannya dalam satu kesempatan dengan
find -printf
:The
%P
return path lengkap dari setiap file yang ditemukan, dikurangi jalan yang ditentukan pada baris perintah, sampai dengan dan termasuk garis miring pertama. Ini akan mempertahankan subdirektori dalam struktur direktori Anda.sumber
./
prefix sebenarnya fitur; tanpa itu, piping output ke perintah lain tidak akan berfungsi dengan baik misalnya untuk nama file yang dimulai dengan tanda hubung.Mengapa Anda perlu melepas
./
? Ini sah untuk dimiliki di jalur. Begitutidak apa-apa!
Tetapi jika Anda ingin menghapus nama direktori di find Anda dapat menggunakan
%P
arg to-printf
.man find (1) mengatakan:
Sebuah contoh
Pikirkan baris kosong pertama! Jika Anda ingin menghindarinya gunakan
-mindepth 1
sumber
Anda punya beberapa opsi. Anda dapat menggunakan
-printf
opsi dalam find untuk hanya mencetak nama file, atau Anda dapat menggunakan alat seperti sed untuk menghapusnya./
.sumber
Solusi "find -printf" tidak akan berfungsi pada FreeBSD karena find tidak memiliki opsi seperti itu. Dalam hal ini AWK dapat membantu. Ini mengembalikan nama belakang ($ NF), sehingga dapat bekerja pada kedalaman apa pun.
PS: diambil dari buku D.Tansley "Linux and Unix shell programming"
sumber
Solusi cepat, jika saya mengerti benar pertanyaannya, gunakan
cut
pada output darifind
perintah:Ini akan menghapus karakter pertama menjadi dari setiap baris hasil (dalam kasus Anda
./
). Mungkin bukan solusi terbaik, tetapi berhasil dalam skenario Anda.sumber
sed
sangat cocok untuk hal semacam ini.sumber
Saya tidak tahu nama file seperti apa yang sedang kita bicarakan, tetapi apa pun dengan spasi atau baris baru membuat sebagian besar solusi beresiko.
Saran saya adalah menggunakan ekspansi parameter shell untuk menghapus karakter dari setiap nama file:
Jika Anda benar-benar menyukai pipa, Anda bisa menggunakan pembatas "aman", seperti nol, dengan xargs untuk menerima setiap nama file:
Ingat bahwa output ini BUKAN pembatas nol, jadi walaupun mungkin cukup untuk pemeriksaan bola mata, tidak ada solusi yang menghasilkan file deploy.txt yang aman digunakan untuk otomatisasi, kecuali Anda sangat yakin dengan sumber Anda nama file.
sumber