Bagaimana cara memindahkan dan membuat ulang folder sekaligus?

9

Saya memiliki folder bernama statisticsdi server Ubuntu di mana file data disimpan secara teratur. Bagaimana saya bisa mengganti nama statisticsfolder backup-xxsaat membuat ulang statisticsfolder agar tersedia untuk menyimpan file baru?

File dalam statisticsfolder dibuat oleh PHP file_put_contents.

Saya lebih suka mengganti nama folder, karena ada banyak file di statisticsfolder.

Googlebot
sumber
Pada awalnya saya pikir Anda maksudkan dengan "pada saat yang sama" bahwa operasi harus "atom" (sejauh mungkin).
phk
@ php Ya, itulah yang saya maksudkan.
Googlebot
Terminologi yang benar adalah "direktori" dan bukan "folder".
Berk Özbalcı

Jawaban:

7
mv statistics backup-xx && mkdir statistics

Ini akan mengubah nama statisticsdirektori yang ada menjadi backup-xx, dan jika itu berhasil akan melanjutkan untuk membuat statisticsdirektori baru .

Untuk operasi yang lebih atomik, pertimbangkan untuk membuat direktori statistics-001(atau serupa, mungkin dengan mengganti 001dengan tanggal hari ini dalam format yang sesuai), dan tautan simbolis yang disebut statistics:

mkdir statistics-001
ln -s statistics-001 statistics

Saat Anda ingin "memutar" ini sehingga data baru masuk ke direktori bersih, buat direktori terlebih dahulu, lalu buat ulang statisticstautannya:

mkdir statistics-002
ln -sf statistics-002 statistics

mv statistics-001 backup-001

Dengan cara ini, setiap program tertulis kepada statisticsdirektori (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 statisticsmenunjuk, 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.

Kusalananda
sumber
1
Anda mungkin juga ingin chown --reference=backup-xx statistics ; chmod --reference=backup-xx statisticsmengatur kepemilikan dan izin. Ide Anda akan melakukan ini sebelum mengganti nama, jadi mkdir new ; chown ; chmod ; mv stats backup ; mv new statsketik proses.
Stephen Harris
@StephenHarris Ya, pada sistem yang memiliki bendera itu.
Kusalananda
Tapi ini bukan atom. Sangat dekat dengan atom, tetapi tidak cukup.
CVn
@ MichaelKjörling Memperbaikinya.
Kusalananda
ln -sfbukan 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 menggunakan renamefungsi (melalui mvperintah, misalnya) untuk mengganti yang lama secara atom. Lihat pendekatan saya untuk itu di sini: git.musl-libc.org/cgit/musl/tree/tools/…
R .. GitHub BERHENTI MENGHENTIKAN ICE
12

Tidak ada cara untuk secara atom mengganti direktori dengan direktori lain. Anda dapat memindahkan direktori lama kemudian membuat direktori baru:

mv statistics backup-xx
mkdir statistics

Tapi ini menyisakan sedikit waktu yang statisticstidak 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:

mkdir "statistics-$(date +%Y%m%d)"

(atau bagaimanapun Anda ingin memilih konvensi penamaan direktori). Buat tautan simbolis dengan nama tetap ke lokasi saat ini:

ln -s  statistics

Untuk mengganti direktori, pertama buat direktori baru dan tautan simbolik baru, dan kemudian pindahkan untuk menimpa tautan simbolik yang lama. Perhatikan bahwa baik polos mvpada tautan simbolik maupun polos ln -stidak akan melakukan ini: mereka akan membuat entri di dalam direktori target. GNU coreutils ln -snfjuga 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 coreutils mv -Tdi tautan simbolis baru.

new_dir="statistics-$(date +%Y%m%d)"
mkdir "$new_dir"
ln -s statistics.new
mv -Tf statistics.new statistics
Gilles 'SANGAT berhenti menjadi jahat'
sumber
busybox' ln -sfjuga bukan atom, saya tidak tahu implementasi apa pun itu.
phk
1
Selain symlink komentar phk juga tidak 100% aman karena proses yang berjalan mungkin masih memiliki deskriptor file direktori terbuka (target symlink) dan itu bisa membuat lebih banyak file baru di direktori yang diubah namanya (think about 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 penggunaan logrotateyang harus menghormati masalah seperti itu sebaik mungkin.
rudimeier
1
@phk symlinkPanggilan sistem tidak akan menimpa file yang sudah ada, jadi tidak mungkin untuk secara langsung mengganti tautan simbolis secara atomis. The renamesystem call akan menimpa file yang sudah ada, tapi mengganggu tidak ada cara portabel untuk melakukannya di shell; itu dimungkinkan dengan GNU coreutils berkat -Topsi ini.
Gilles 'SANGAT berhenti menjadi jahat'
3

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, mvakan memakan waktu sebanyak cptidak peduli apakah itu memindahkan direktori atau isinya.

Jadi, lakukan saja:

mkdir backup-xx && mv statistics/* backup-xx

Jika Anda juga perlu mendapatkan file tersembunyi, Anda dapat melakukan:

mkdir backup-xx && mv statistics/* statistics/.* backup-xx

Atau, jika menggunakan bash:

shopt -s dotglob; mkdir backup-xx && mv statistics/* statistics/.* backup-xx

Dengan cara ini, direktori selalu ada tetapi Anda masih memindahkan isinya dengan operasi yang sederhana dan cepat.

terdon
sumber
1

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.

mkdir -p <path>/backup-xxx
mv statistics/* <path>/backup-xxx/.
Kiran Kumar Annam
sumber