IFS=$(echo -en "\n\b")
Так как вы используете оболочку echo -e, и в любом случае у вас есть bash в строке shebang, вы можете использовать IFS=$'\n\b'. Сделать Backspace разделителем довольно странно. Вам все равно не нужно 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с тех пор, и глобализация отключена, но на самом деле всегда ставьте двойные кавычки, если вы не знаете, почему вы можете ' оставь их включенными).
Это неуклюже и непереносимо ( 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/… за некоторыми советами.