IFS=$(echo -en "\n\b")
Ponieważ zakładasz powłokę echo -e
, a i tak masz uderzenie w linii shebang, możesz użyć IFS=$'\n\b'
. Przekształcanie separatora w backspace jest raczej dziwne. I tak nie potrzebujesz IFS
tego, co robisz.
OLDIFS=$IFS
…
IFS=$OLDIFS
Zauważ, że przywraca to starą wartość IFS
tylko wtedy, gdy IFS
została początkowo ustawiona. Jeśli IFS
początkowo był rozbrojony, ustawia IFS
się na pusty ciąg, który jest zupełnie inny. W ksh, bash lub zsh, jeśli musisz ustawić IFS
tymczasowo, możesz napisać kod w funkcji i ustawić ją IFS
lokalnie. W innych powłokach musisz uważać na nierozbieralną obudowę.
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
Nigdy nie używaj podstawiania poleceń na wyjściu find
.
- Dzieli to wynik na znaki w
$IFS
. Jeśli ustawisz IFS
na nową linię, spowoduje to podział wyniku na nowe linie, ale nadal nie możesz obsługiwać nazw plików zawierających nowe linie.
- Wynik zastąpienia polecenia jest nie tylko podzielony na słowa, ale następnie każde słowo jest używane jako wzorzec globalny. Jeśli zgłosisz pliki
A[12].pdf
, A1.pdf
a A2.pdf
skończysz na A1.pdf A2.pdf A1.pdf A2.pdf
. Możesz wyłączyć globowanie za pomocą set -f
(i ponownie za pomocą set +f
), ale tutaj (jak przez większość czasu) właściwym sposobem nie jest stosowanie zastępowania poleceń.
Użyj -exec
argumentu, aby find
(lub jeśli twój system ma -print0
, możesz użyć find … -print0 | xargs -0 …
zamiast tego; jest to przydatne tylko do działania na wielu plikach na raz, jeśli potrzebujesz przenośności do starożytnych systemów Linux lub obecnych systemów OpenBSD, które mają, -print0
ale nie -exec … {} +
).
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
Pamiętaj, że brakuje ci podwójnych cudzysłowów $f
(nie są one potrzebne, jeśli są to wyniki podziału i od tego czasu nie zmieniłeś się, IFS
a globowanie jest wyłączone, ale tak naprawdę zawsze umieszczaj podwójne cudzysłowy, chyba że wiesz, dlaczego możesz „ zostaw je włączone).
Jest to niezdarne i nieprzenośne ( stat
nie istnieje we wszystkich systemach, a jego argumenty są różne w różnych systemach, w których istnieje). touch
posiada przenośny opcję, aby ustawić pliku do znacznika czasu innego pliku: touch -r REFERENCE_FILE FILE
. Zamiast tego poleciłbym jedno z dwóch podejść:
- Jeśli możesz, najpierw przekształć oryginalny plik w nowy plik, a następnie zadzwoń,
touch -r
aby ustawić datę nowego pliku, a na koniec przenieś nowy plik na miejsce. Lepiej jest upewnić się, że wyjście jest w porządku, zanim cokolwiek stanie się z danymi wejściowymi; w przeciwnym razie, jeśli transformacja zostanie przerwana z jakiegokolwiek powodu (np. awaria zasilania), utracisz dane.
- Jeśli transformacja jest czarną skrzynką, nad którą nie masz kontroli, możesz użyć jej
touch -r
dwukrotnie: raz, aby zapisać datę oryginalnego pliku w pustym pliku tymczasowym (który zostanie utworzony automatycznie), a następnie ponownie po transformacji, aby przywrócić datę za pomocą pliku tymczasowego.
A zatem:
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
wydaje się niezwykłe. Czy naprawdę chciałeś podzielić na backspace (\b
)? Zobacz wskazówki na unix.stackexchange.com/questions/9496/ ...