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 IFSde ce que vous faites.
OLDIFS=$IFS
…
IFS=$OLDIFS
Notez que cela restaure l'ancienne valeur de IFSuniquement si elle a IFSété initialement définie. Si IFSétait initialement non défini, cela définit IFSla chaîne vide, ce qui est complètement différent. En ksh, bash ou zsh, si vous avez besoin de définir IFStemporairement, vous pouvez écrire votre code dans une fonction et rendre IFSlocal 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 IFSune 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.pdfet 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' -execargument 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 -print0mais 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é IFSdepuis 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 ( statn'existe pas sur tous les systèmes, et ses arguments sont différents selon les différents systèmes où il existe). toucha 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 -rpour 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 -rdeux 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"' {} \;
IFSsemble inhabituelle. Vouliez-vous vraiment vous séparer sur backspace (\b)? Voir unix.stackexchange.com/questions/9496/… pour quelques conseils.