IFS=$(echo -en "\n\b")
Puisque vous supposez un shell avec echo -e
, et que vous avez quand même bash dans votre ligne de shebang, vous pouvez utiliser IFS=$'\n\b'
. Faire du retour arrière un séparateur est plutôt bizarre. De toute façon, vous n'avez pas besoin IFS
de ce que vous faites.
OLDIFS=$IFS
…
IFS=$OLDIFS
Notez que cela restaure l'ancienne valeur de IFS
uniquement si elle a IFS
été initialement définie. Si IFS
était initialement non défini, cela définit IFS
la chaîne vide, ce qui est complètement différent. En ksh, bash ou zsh, si vous avez besoin de définir IFS
temporairement, vous pouvez écrire votre code dans une fonction et rendre IFS
local cette fonction. Dans d'autres coquilles, vous devez faire attention au cas non réglé.
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
N'utilisez jamais de substitution de commande sur la sortie de find
.
- Cela divise la sortie au niveau des caractères dans
$IFS
. Si vous définissez IFS
une nouvelle ligne, cela divise la sortie aux nouvelles lignes, mais vous ne pouvez toujours pas gérer les noms de fichiers contenant des nouvelles lignes.
- Non seulement le résultat de la substitution de commande est divisé en mots, mais chaque mot est ensuite utilisé comme modèle global. Si vous fichiers appelés
A[12].pdf
, A1.pdf
et A2.pdf
, vous vous retrouverez avec A1.pdf A2.pdf A1.pdf A2.pdf
. Vous pouvez désactiver la globalisation avec set -f
(et la réactiver avec set +f
), mais ici (comme la plupart du temps) la bonne façon n'est pas d'utiliser la substitution de commandes.
Utilisez l' -exec
argument pour find
(ou si votre système a -print0
, vous pouvez utiliser à la find … -print0 | xargs -0 …
place; cela n'est utile que pour agir sur plusieurs fichiers à la fois si vous avez besoin de portabilité vers les anciens systèmes Linux ou les systèmes OpenBSD actuels qui en ont -print0
mais pas -exec … {} +
).
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
Notez que vous manquez des guillemets doubles $f
(ils ne sont pas nécessaires si ce sont les résultats du fractionnement et que vous n'avez pas changé IFS
depuis et que la globalisation est désactivée, mais vraiment, mettez toujours des guillemets doubles sauf si vous savez pourquoi vous pouvez '' ne les laissez pas allumés).
Ceci est maladroit et non portable ( stat
n'existe pas sur tous les systèmes, et ses arguments sont différents selon les différents systèmes où il existe). touch
a une option portable pour définir un fichier à l'horodatage d'un autre fichier: touch -r REFERENCE_FILE FILE
. Je recommanderais plutôt l'une des deux approches:
- Si vous le pouvez, commencez par transformer le fichier d'origine en un nouveau fichier, puis appelez
touch -r
pour définir la date du nouveau fichier, et enfin déplacez le nouveau fichier en place. Il est préférable de s'assurer que la sortie est correcte avant que quoi que ce soit arrive à l'entrée; sinon, si la transformation est interrompue pour une raison quelconque (par exemple une panne de courant), vous perdrez des données.
- Si la transformation est une boîte noire sur laquelle vous n'avez aucun contrôle, vous pouvez utiliser
touch -r
deux fois: une fois pour enregistrer la date du fichier d'origine sur un fichier temporaire vide (qui sera automatiquement créé), puis à nouveau après la transformation pour restaurer la date en utilisant le fichier temporaire.
Donc:
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
semble inhabituelle. Vouliez-vous vraiment vous séparer sur backspace (\b
)? Voir unix.stackexchange.com/questions/9496/… pour quelques conseils.