Ho usato, invece di mv, il cpcomando per ottenere che tu sia in grado di avere alcuni file di registro sul posto dove è in esecuzione un software. Forse nella diversa home directory dell'utente o nella directory dell'app e tutti i log sono in un unico posto come hardlink. Se si utilizza il mvcomando si perde il collegamento reale. Se si utilizza il cpcomando invece si manterrà questo collegamento reale.
il mio codice è qualcosa del tipo:
TMP_FILE="$(mktemp "${TMPFILENAME}.XXX")"
for FILE in "${LOGFILE_DIR}"/* ; do
tail -n $MAXLINES "${FILE}" > "${TMP_FILE}"
if [ $(ls -g "${TMP_FILE}" | awk '{print $4}') -lt $(ls -g "${FILE}" | awk '{print $4}') ] ; then
cp "${TMP_FILE}" "${FILE}"
fi
done
Quindi, se i file si trovano sullo stesso filesystem, potresti dare anche alcuni diritti diversi agli utenti e nel ${LOGFILE_DIR}modificarne la lunghezza come faccio io.
Se è il mv comando perdi il collegamento tra i file e quindi il tuo secondo file non è più connesso al primo - forse posto altrove.
Se dall'altra parte non permetti a qualcuno di cancellare il file, i tuoi registri rimarranno insieme e sarai ben controllato tramite il tuo script.
logrotateforse più bello. Ma sono contento di questa soluzione.
Non essere disturbato dal "", ma nel mio caso ci sono alcuni file con spazi e altre lettere speciali in e Se non faccio il "" in giro o il {} l'intero lotto non funziona bene.
Per esempio c'è un Dir in cui i file più vecchi ottiene automatizzati zip in una OLDFILE.zipe tutto ciò che viene compresso è così elencati nel file .zip_login modo che il .zip_logè in questo Dir pure ma nel LOGFILE_DIRquando ci sono andata con:
ln .zip_log "${LOGFILE_DIR}/USER_ZIP_log"
il file uguale in quanto è un collegamento reale.
logrotateè la soluzione elegante