IFS=$(echo -en "\n\b")
Da Sie eine Shell mit annehmen echo -e
und ohnehin Bash in Ihrer Shebang-Linie haben, können Sie verwenden IFS=$'\n\b'
. Rücktaste zu einem Trennzeichen zu machen ist ziemlich seltsam. Sie brauchen IFS
sowieso nicht für das, was Sie tun.
OLDIFS=$IFS
…
IFS=$OLDIFS
Beachten Sie, dass dadurch der alte Wert von IFS
nur wiederhergestellt wird, wenn er IFS
ursprünglich festgelegt wurde. Wenn dies IFS
ursprünglich nicht festgelegt wurde IFS
, wird die leere Zeichenfolge festgelegt, die völlig anders ist. Wenn Sie in ksh, bash oder zsh IFS
vorübergehend festlegen müssen , können Sie Ihren Code in eine Funktion schreiben und IFS
diese Funktion lokalisieren. In anderen Schalen müssen Sie vorsichtig mit dem nicht eingestellten Fall sein.
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
Verwenden Sie niemals die Befehlssubstitution für die Ausgabe von find
.
- Dadurch wird die Ausgabe an den Zeichen in aufgeteilt
$IFS
. Wenn Sie IFS
eine neue Zeile festlegen, wird die Ausgabe in Zeilenumbrüche aufgeteilt, Sie können jedoch weiterhin keine Dateinamen verarbeiten, die Zeilenumbrüche enthalten.
- Das Ergebnis der Befehlssubstitution wird nicht nur in Wörter aufgeteilt, sondern jedes Wort wird als Glob-Muster verwendet. Wenn Sie Dateien aufgerufen haben
A[12].pdf
, A1.pdf
und A2.pdf
, werden Sie am Ende mit A1.pdf A2.pdf A1.pdf A2.pdf
. Sie können das Globbing mit set -f
(und wieder mit set +f
) aktivieren , aber hier (wie meistens) besteht der richtige Weg darin, keine Befehlssubstitution zu verwenden.
Verwenden Sie das -exec
Argument für find
(oder wenn Ihr System dies hat -print0
, können Sie es find … -print0 | xargs -0 …
stattdessen verwenden; dies ist nur nützlich, um auf mehrere Dateien gleichzeitig zu reagieren, wenn Sie eine Portabilität auf alte Linux-Systeme oder aktuelle OpenBSD-Systeme benötigen, die dies -print0
jedoch nicht tun -exec … {} +
).
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
Beachten Sie, dass Sie doppelte Anführungszeichen vermissen $f
(diese werden nicht benötigt, wenn dies das Ergebnis der Aufteilung ist und Sie sich seitdem nicht geändert haben IFS
und das Globbing deaktiviert ist. Setzen Sie jedoch immer doppelte Anführungszeichen, es sei denn, Sie wissen, warum Sie dies können. ' t lass sie an).
Dies ist umständlich und nicht portierbar ( stat
existiert nicht auf allen Systemen, und seine Argumente unterscheiden sich zwischen den verschiedenen Systemen, auf denen es existiert). touch
hat eine tragbare Option, um eine Datei auf den Zeitstempel einer anderen Datei zu setzen : touch -r REFERENCE_FILE FILE
. Ich würde stattdessen einen von zwei Ansätzen empfehlen:
- Wenn Sie können, wandeln Sie zuerst die Originaldatei in eine neue Datei um, rufen Sie dann
touch -r
auf, um das Datum der neuen Datei festzulegen, und verschieben Sie die neue Datei schließlich an ihren Platz. Es ist besser sicherzustellen, dass die Ausgabe in Ordnung ist, bevor etwas mit der Eingabe passiert. Andernfalls gehen Daten verloren, wenn die Umwandlung aus irgendeinem Grund unterbrochen wird (z. B. aufgrund eines Stromausfalls).
- Wenn es sich bei der Umwandlung um eine Black Box handelt, über die Sie keine Kontrolle haben, können Sie sie
touch -r
zweimal verwenden: einmal, um das Datum der Originaldatei in einer leeren temporären Datei zu speichern (die automatisch erstellt wird), und erneut nach der Umwandlung, um das Datum wiederherzustellen Verwenden der temporären Datei.
Somit:
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
scheint ungewöhnlich. Wollten Sie wirklich auf backspace (\b
) teilen ? Einige Tipps finden Sie unter unix.stackexchange.com/questions/9496/… .