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 IFS
di quello che stai facendo comunque.
OLDIFS=$IFS
...
IFS=$OLDIFS
Si noti che ciò ripristina il vecchio valore di IFS
solo se IFS
inizialmente era impostato. Se IFS
inizialmente non era impostato, questo si imposta IFS
sulla stringa vuota, che è completamente diversa. In ksh, bash o zsh, se è necessario impostare IFS
temporaneamente, è possibile scrivere il codice in una funzione e renderlo IFS
locale 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 IFS
su 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.pdf
e 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' -exec
argomento 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 -print0
ma 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 IFS
da 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 ( stat
non esiste su tutti i sistemi e i suoi argomenti sono diversi nei diversi sistemi in cui esiste). touch
ha 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 -r
per 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 -r
due 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"' {} \;
IFS
sembra insolito. Volevi davvero dividere su backspace (\b
)? Consulta unix.stackexchange.com/questions/9496/… per alcuni suggerimenti.