Я пытаюсь OCR некоторые документы insitu (из командной строки Linux на общий ресурс Windows). Процесс OCRing - это поиск, и я запутался в использовании команды find для правильной передачи файлов через цикл.
Однако мне нужно сохранить исходную метку времени для изменения. В настоящее время я пытаюсь использовать stat и touch, как показано ниже:
#!/bin/bash
OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for f in `find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
do
ORIGTS=`stat -c "%Y" $f`
sudo /opt/ABBYYOCR9/abbyyocr9 -rl English -pi -if $f -f PDFA -paemImageOnText -pafpr original -of $f
touch -t $ORIGTS $f
done
IFS=$OLDIFS
Конечно, сенсорная команда не работает. Запуская команды по отдельности, я замечаю, что "stat -c" - что-то вроде этого:
1334758696
это как свидание, которое я не знаю. Я чувствую, как будто я близко, но не могу понять, как преобразовать дату, которую я имею в, к дружественной к прикосновению версии. Это какая-то форма секунд от чего-то?
IFS
кажется необычным. Вы действительно хотели разделить Backspace (\b
)? См. Unix.stackexchange.com/questions/9496/… за некоторыми советами.Ответы:
stat's
output - это метка времени Unix, также называемая секундами с начала эпохи .Все coreutils GNU, которые принимают дату, позволяют вместо этого поставить временную метку, поставив перед ней метку
@
.Так попробуй это
Смотрите coreutils - секунды с начала эпохи
источник
touch
можете использовать временную метку файла, используя-r
опцию. Возможно, вы захотите вывести в другой файл (я предполагаю, что ниже это-if
входной файл и-of
выходной файл)источник
stat
.Так как вы используете оболочку
echo -e
, и в любом случае у вас есть bash в строке shebang, вы можете использоватьIFS=$'\n\b'
. Сделать Backspace разделителем довольно странно. Вам все равно не нужноIFS
то, что вы делаете.Обратите внимание, что это восстанавливает старое значение,
IFS
только еслиIFS
было изначально установлено. ЕслиIFS
изначально был сброшен, это устанавливаетIFS
пустую строку, которая полностью отличается. В ksh, bash или zsh, если вам нужноIFS
временно установить , вы можете написать свой код в функции и сделать ееIFS
локальной. В других оболочках нужно быть осторожным с неустановленным случаем.Никогда не используйте подстановку команд на выходе
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 … {} +
).Обратите внимание, что вы пропускаете двойные кавычки
$f
(они не нужны, если это результат разделения, и вы не изменилисьIFS
с тех пор, и глобализация отключена, но на самом деле всегда ставьте двойные кавычки, если вы не знаете, почему вы можете ' оставь их включенными).Это неуклюже и непереносимо (
stat
не существует во всех системах, и его аргументы различны в разных системах, где он существует).touch
имеет портативный вариант для установки файла в метку времени другого файла:touch -r REFERENCE_FILE FILE
. Я бы порекомендовал один из двух подходов:touch -r
чтобы установить дату нового файла, и, наконец, переместите новый файл на место. Лучше убедиться, что с выводом все в порядке, прежде чем что-то случится со входом; в противном случае, если преобразование прервано по какой-либо причине (например, сбой питания), вы потеряете данные.touch -r
дважды: один раз, чтобы сохранить дату исходного файла в пустом временном файле (который будет создан автоматически), затем снова после преобразования, чтобы восстановить дату используя временный файл.Таким образом:
источник
По какой-то причине я пропустил ответ о
touch -r
; если по какой-то странной причине у вас нет GNU coreutils,stat
как в принятом ответе, и вы не можете его использоватьtouch -r
, вот как получитьtouch
временную метку в дружественном формате с BSD-подобнымstat
.Но на самом деле, просто используйте
touch -r
:источник
У меня была та же проблема, возникшая в процессе «кинопроизводства».
В приведенном ниже примере
orig_file.wav
это файл с оригинальной отметкой времени, аprocessed_file.wav
файл с тем же содержимым, но с неверной отметкой времени.ПЕРЕД:
localhost $ ls -lh orig_file.wav processed_file.wav Jan 23 17:15 processed_file.wav Jul 9 2018 orig_file.wav
КОМАНДА:
localhost $ touch -t $(date --date=@`stat -f%B orig_file.wav` +%Y%m%d%H%M.%S) processed_file.wav
ПОСЛЕ:
localhost $ ls -lh orig_file.wav processed_file.wav Jul 9 2018 processed_file.wav Jul 9 2018 orig_file.wav
ЗАМЕТКИ:
stat
в перевернутых тиках дает метку времени создания исходного файла как время эпохи Unix (в секундах). Символ @ from coreutils преобразует его в iso-дату, котораяdate
может понимать и переформатировать с помощью YYYYMMDDHHmm.SS, чтобы ееtouch
можно было понять. Я поместилdate
команду в $ (), как эквивалент инвертированных тиков, поскольку они не могут быть повторно использованы в одной команде.источник
touch -r
)? (2)stat
можно положить в$(…)
; они могут быть использованы несколько раз в одной команде.