IFS=$(echo -en "\n\b")
Оскільки ви припускаєте снаряд echo -e, і у вас все-таки вибух у вашій лінії шебанг, ви можете використовувати IFS=$'\n\b'. Зробити роздільну частину заднього простору досить дивно. Вам все одно не потрібно IFSдля того, що ви робите.
OLDIFS=$IFS
…
IFS=$OLDIFS
Зауважте, що це відновлює старе значення IFSлише, якщо воно IFSбуло встановлено спочатку. Якщо IFSспочатку не було встановлено, це встановлює IFSпорожній рядок, який зовсім інший. У ksh, bash або zsh, якщо вам потрібно встановити IFSтимчасово, ви можете написати свій код у функції та зробити IFSлокальну для цієї функції. В інших снарядах вам слід бути обережними щодо справи, що не було встановлено.
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
Ніколи не використовуйте заміну команд на виході find.
- Це розділяє вихід на символи в
$IFS. Якщо ви встановите IFSновий рядок, то це розбиває вихід на нові рядки, але ви все одно не можете обробити імена файлів, що містять нові рядки.
- Не тільки результат заміни команд розбивається на слова, але потім кожне слово використовується як глобальний зразок. Якщо ви зателефонували до файлів
A[12].pdf, A1.pdfі A2.pdfви закінчите A1.pdf A2.pdf A1.pdf A2.pdf. Ви можете вимкнути глобус за допомогою set -f(і знову ввімкнути set +f), але тут (як і більшість випадків) правильним способом є не використання підстановки команд.
Використовуйте -execаргумент find(або, якщо у вашій системі -print0, ви можете використовувати find … -print0 | xargs -0 …замість цього; це корисно для дії відразу на декілька файлів, якщо вам потрібна переносимість до стародавніх систем Linux або поточних систем OpenBSD, які є, -print0але ні -exec … {} +).
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
Зауважте, що вам не вистачає подвійних лапок $f(вони не потрібні, якщо це результати розщеплення, і ви з того часу не змінювались, IFSі глобус вимкнено, але насправді завжди ставити подвійні лапки, якщо ви не знаєте, чому ви можете " t залиште їх увімкнено).
Це незграбно і не портативно ( statне існує у всіх системах, а його аргументи різні в різних системах, де вони існують). touchмає портативний варіант для установки файлу в мітку часу іншого файлу: touch -r REFERENCE_FILE FILE. Я б рекомендував один із двох підходів:
- Якщо ви можете, спочатку перетворіть оригінальний файл у новий файл, потім зателефонуйте,
touch -rщоб встановити дату нового файлу, і, нарешті, перемістіть новий файл на місце. Краще переконайтеся, що вихідний сигнал добре, перш ніж щось трапиться на вході; в іншому випадку, якщо перетворення буде перервано з будь-якої причини (наприклад, відключення живлення), ви втратите дані.
- Якщо перетворення - це чорне поле, над яким ви не маєте контролю, ви можете використовувати
touch -rдвічі: один раз, щоб зберегти дату вихідного файлу в порожньому тимчасовому файлі (який буде створено автоматично), потім знову після перетворення відновити дату використовуючи тимчасовий файл.
Таким чином:
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здається незвичним. Ви дійсно хотіли розділити на backspace (\b)? Дивіться unix.stackexchange.com/questions/9496/… для деяких порад.