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/… за некоторыми советами.