Saya memiliki folder bernama statistics
di server Ubuntu di mana file data disimpan secara teratur. Bagaimana saya bisa mengganti nama statistics
folder backup-xx
saat membuat ulang statistics
folder agar tersedia untuk menyimpan file baru?
File dalam statistics
folder dibuat oleh PHP file_put_contents
.
Saya lebih suka mengganti nama folder, karena ada banyak file di statistics
folder.
bash
shell-script
files
rename
Googlebot
sumber
sumber
Jawaban:
Ini akan mengubah nama
statistics
direktori yang ada menjadibackup-xx
, dan jika itu berhasil akan melanjutkan untuk membuatstatistics
direktori baru .Untuk operasi yang lebih atomik, pertimbangkan untuk membuat direktori
statistics-001
(atau serupa, mungkin dengan mengganti001
dengan tanggal hari ini dalam format yang sesuai), dan tautan simbolis yang disebutstatistics
:Saat Anda ingin "memutar" ini sehingga data baru masuk ke direktori bersih, buat direktori terlebih dahulu, lalu buat ulang
statistics
tautannya:Dengan cara ini, setiap program tertulis kepada
statistics
direktori (yaitu direktori yang ini link simbolik poin untuk) tidak akan pernah 1 gagal untuk menemukannya.Jika Anda memerlukan izin khusus atau kepemilikan yang ditetapkan pada direktori yang
statistics
menunjuk, tetapkan ini sebelum (kembali) membuat tautan.1 Atau lebih tepatnya, dengan cara ini, waktu suatu program tanpa direktori target yang valid dapat diminimalisasi sebanyak mungkin dengan menggunakan alat Unix standar.
sumber
chown --reference=backup-xx statistics ; chmod --reference=backup-xx statistics
mengatur kepemilikan dan izin. Ide Anda akan melakukan ini sebelum mengganti nama, jadimkdir new ; chown ; chmod ; mv stats backup ; mv new stats
ketik proses.ln -sf
bukan atom. Ini ditentukan untuk memutuskan tautan symlink lama lalu membuat yang baru, yang tentu saja bukan atom. Sebagai gantinya, Anda harus membuat symlink sementara tambahan dan menggunakanrename
fungsi (melaluimv
perintah, misalnya) untuk mengganti yang lama secara atom. Lihat pendekatan saya untuk itu di sini: git.musl-libc.org/cgit/musl/tree/tools/…Tidak ada cara untuk secara atom mengganti direktori dengan direktori lain. Anda dapat memindahkan direktori lama kemudian membuat direktori baru:
Tapi ini menyisakan sedikit waktu yang
statistics
tidak ada. Ini adalah masalah jika beberapa proses dapat menjatuhkan file di direktori kapan saja.Untuk secara efektif mengganti direktori, Anda perlu menggunakan tautan simbolik. Buat direktori yang namanya termasuk periode waktu dari awal:
(atau bagaimanapun Anda ingin memilih konvensi penamaan direktori). Buat tautan simbolis dengan nama tetap ke lokasi saat ini:
Untuk mengganti direktori, pertama buat direktori baru dan tautan simbolik baru, dan kemudian pindahkan untuk menimpa tautan simbolik yang lama. Perhatikan bahwa baik polos
mv
pada tautan simbolik maupun polosln -s
tidak akan melakukan ini: mereka akan membuat entri di dalam direktori target. GNU coreutilsln -snf
juga tidak cocok karena menghapus symlink yang ada sebelum membuat yang baru, yang meninggalkan jendela waktu kecil di mana path tidak ada. Anda dapat menggunakan GNU coreutilsmv -T
di tautan simbolis baru.sumber
busybox
'ln -sf
juga bukan atom, saya tidak tahu implementasi apa pun itu.openat()
atau CWD). Saya hanya akan memindahkan konten direktori ke yang baru. Itu masih tidak aman tentang file terbuka, tetapi sedikit lebih baik. Dalam keraguan penggunaanlogrotate
yang harus menghormati masalah seperti itu sebaik mungkin.symlink
Panggilan sistem tidak akan menimpa file yang sudah ada, jadi tidak mungkin untuk secara langsung mengganti tautan simbolis secara atomis. Therename
system call akan menimpa file yang sudah ada, tapi mengganggu tidak ada cara portabel untuk melakukannya di shell; itu dimungkinkan dengan GNU coreutils berkat-T
opsi ini.Jangan mengganti nama direktori sama sekali. Anda mengatakan bahwa Anda lebih suka mengganti nama direktori karena memiliki banyak file. Satu-satunya alasan saya dapat memikirkan bahwa Anda menginginkan ini adalah karena menyalin file akan memakan waktu terlalu lama. Namun, memindahkan (mis. Mengganti nama) file bersifat instan selama mereka dipindahkan ke lokasi pada sistem file yang sama. Saya berasumsi ini adalah apa yang Anda lakukan karena jika Anda mengubah sistem file,
mv
akan memakan waktu sebanyakcp
tidak peduli apakah itu memindahkan direktori atau isinya.Jadi, lakukan saja:
Jika Anda juga perlu mendapatkan file tersembunyi, Anda dapat melakukan:
Atau, jika menggunakan
bash
:Dengan cara ini, direktori selalu ada tetapi Anda masih memindahkan isinya dengan operasi yang sederhana dan cepat.
sumber
Anda dapat memindahkan konten folder statistik ke direktori yang baru dibuat daripada memindahkan folder itu sendiri. Jika Anda memindahkan seluruh folder maka Anda harus menjalankan perintah lain untuk mengubah izin direktori.
sumber