IFS=$(echo -en "\n\b")
Dato che stai assumendo una shell con echo -e, e hai comunque bash nella tua linea shebang, puoi usare IFS=$'\n\b'. Rendere il backspace un separatore è piuttosto strano. Non hai bisogno IFSdi quello che stai facendo comunque.
OLDIFS=$IFS
...
IFS=$OLDIFS
Si noti che ciò ripristina il vecchio valore di IFSsolo se IFSinizialmente era impostato. Se IFSinizialmente non era impostato, questo si imposta IFSsulla stringa vuota, che è completamente diversa. In ksh, bash o zsh, se è necessario impostare IFStemporaneamente, è possibile scrivere il codice in una funzione e renderlo IFSlocale per questa funzione. In altre shell, è necessario fare attenzione al caso non impostato.
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
Non usare mai la sostituzione dei comandi sull'output di find.
- Questo divide l'output in corrispondenza dei caratteri
$IFS. Se si imposta IFSsu una nuova riga, questo divide l'output su nuove righe, ma non è ancora possibile gestire nomi di file contenenti nuove righe.
- Non solo il risultato della sostituzione dei comandi viene suddiviso in parole, ma ogni parola viene utilizzata come modello glob. Se si file chiamati
A[12].pdf, A1.pdfe A2.pdf, vi ritroverete con A1.pdf A2.pdf A1.pdf A2.pdf. Puoi disattivare il globbing con set -f(e riaccendere con set +f), ma qui (come la maggior parte delle volte) il modo giusto non è usare la sostituzione dei comandi.
Usa l' -execargomento per find(o se il tuo sistema ha -print0, puoi find … -print0 | xargs -0 …invece usare ; questo è utile per agire su più file contemporaneamente se hai bisogno di portabilità su antichi sistemi Linux o sistemi OpenBSD attuali che hanno -print0ma non -exec … {} +).
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
Tieni presente che ti mancano doppie virgolette $f(non sono necessarie se questi sono i risultati della divisione e non sei cambiato IFSda allora e il globbing è disattivato, ma in realtà metti sempre doppie virgolette a meno che tu non sappia perché puoi " non lasciarli accesi).
Questo è goffo e non portatile ( statnon esiste su tutti i sistemi e i suoi argomenti sono diversi nei diversi sistemi in cui esiste). touchha un'opzione portatile per impostare un file per il timestamp di un altro file: touch -r REFERENCE_FILE FILE. Raccomanderei invece uno dei due approcci:
- Se possibile, prima trasforma il file originale in un nuovo file, quindi chiama
touch -rper impostare la data del nuovo file e infine spostare il nuovo file in posizione. È meglio assicurarsi che l'output sia corretto prima che accada qualcosa; in caso contrario, se la trasformazione viene interrotta per qualsiasi motivo (ad es. mancanza di corrente), si perderanno i dati.
- Se la trasformazione è una scatola nera su cui non hai alcun controllo, puoi usarla
touch -rdue volte: una volta per salvare la data del file originale su un file temporaneo vuoto (che verrà creato automaticamente), quindi di nuovo dopo la trasformazione per ripristinare la data utilizzando il file temporaneo.
Così:
find /mnt/library/Libra/Libra/Ashfords -name '*.pdf' \
-exec sh -c 'transform "$0" to "$0.tmp" && touch -r "$0" "$0.tmp" && mv -f "$0.tmp" "$0"' {} \;
IFSsembra insolito. Volevi davvero dividere su backspace (\b)? Consulta unix.stackexchange.com/questions/9496/… per alcuni suggerimenti.