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 IFStego, co robisz.
OLDIFS=$IFS
…
IFS=$OLDIFS
Zauważ, że przywraca to starą wartość IFStylko wtedy, gdy IFSzostała początkowo ustawiona. Jeśli IFSpoczątkowo był rozbrojony, ustawia IFSsię na pusty ciąg, który jest zupełnie inny. W ksh, bash lub zsh, jeśli musisz ustawić IFStymczasowo, możesz napisać kod w funkcji i ustawić ją IFSlokalnie. 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 IFSna 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.pdfa A2.pdfskoń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 -execargumentu, 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ą, -print0ale 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ę, IFSa 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 ( statnie istnieje we wszystkich systemach, a jego argumenty są różne w różnych systemach, w których istnieje). touchposiada 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 -raby 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 -rdwukrotnie: 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"' {} \;
IFSwydaje się niezwykłe. Czy naprawdę chciałeś podzielić na backspace (\b)? Zobacz wskazówki na unix.stackexchange.com/questions/9496/ ...