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/… для деяких порад.