Saya memiliki perintah yang menerima file sebagai argumen, memodifikasi file, lalu menulisnya ke nama file yang ditentukan dalam argumen kedua. Saya akan memanggil program itu modifyfile
.
Saya ingin ini berfungsi "di tempat" jadi saya menulis skrip shell (bash) yang mengubahnya menjadi file sementara lalu memindahkannya kembali:
TMP=`mktemp`
modifyfile "$original" "$TMP"
mv -v "$TMP" "$original"
Ini memiliki efek samping yang tidak diinginkan yaitu menghancurkan izin pada file ini. File dibuat ulang dengan izin default.
Apakah ada cara untuk memberi tahu mv
perintah untuk menimpa tujuan tanpa mengubah izinnya? Atau bergantian apakah ada cara untuk menyelamatkan pengguna, grup, dan permisisi dari yang asli dan memulihkannya?
sumber
rm "$TMP"
juga, tetapi tampaknya melakukan apa yang saya inginkan.mv
sebagai gantinya. Saya tidak melihat cara untuk menyelesaikan masalah itu.chown
hanya berfungsi sebagai root.chmod
danchgrp
mungkin atau mungkin tidak berfungsi tergantung pada izin pengguna. Baik menyalin atribut lain seperti ACL atau atribut diperluas khusus sistem file.Ada dua strategi untuk mengganti file dengan versi baru:
Buat file sementara dengan versi baru, lalu pindahkan ke tempatnya.
Timpa file lama di tempatnya.
Jika Anda bisa, gunakan metode 1, tetapi pertama-tama salin atribut dengan file asli
cp -p --attributes-only
. Ini membutuhkan GNU coreutils (yaitu Linux yang tidak tertanam, atau lingkungan yang cukup seperti Linux). Jika Andacp
tidak memilikinya--attributes-only
, abaikan opsi ini: itu akan berfungsi tetapi itu akan mereplikasi data juga.Jika Anda tidak dapat mereplikasi atribut dari file yang ada, misalnya karena Anda memiliki izin tulis tetapi tidak memilikinya dan Anda ingin mempertahankan pemiliknya, maka hanya metode 2 yang memungkinkan. Untuk meminimalkan risiko kehilangan data:
sumber
cp -p --attributes-only "$original" "$tmp"
tidak akan menggunakan sumber daya untuk menyalin konten file. Saya tidak dapat menemukan dari versi mana argumen ini ditambahkan.cp
implementasi lain .Setelah diskusi kami tentang jawaban pertama, saya mengusulkan jawaban yang berbeda:
Catatan:
$original
dalammktemp
template untuk memastikan bahwa file sementara tidak ditempatkan/tmp
tetapi dalam folder yang sama dengan$original
. Saya percaya bahwa jika/tmp
dipasang pada sistem file yang berbeda operasi tidak akan lagi menjadi atom.mktemp
sekarang dikutip jika mengandung spasi.$()
bukan `` karena saya menganggapnya lebih bersih.ch{mod,own} --reference
digunakan untuk mentransfer izin$original
untuk$TMP
. Jika seseorang memiliki ide tambahan tentang metadata apa yang dapat dan harus ditransfer, maka silakan edit posting saya dan tambahkan.sumber