통계를 사용하여 터치 타임 스탬프 제공


11

Windows 공유의 Linux 명령 줄에서 일부 문서를 OCR하려고합니다. OCRing 프로세스는 find이며 루프를 통해 파일을 올바르게 파이프하기 위해 find 명령을 사용하여 혼란을 겪었습니다.

그러나 수정 된 원래 타임 스탬프를 유지해야합니다. 현재 stat를 사용하고 아래처럼 터치하려고합니다.

#!/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드문 것 같습니다. 백 스페이스에서 분리하고 싶습니까 ( \b)? 몇 가지 팁 은 unix.stackexchange.com/questions/9496/… 을 참조하십시오 .
Mikel

답변:


17

stat'soutput은 Unix 타임 스탬프이며 Epoch 이후 초 라고도 합니다 .

날짜를 허용하는 모든 GNU coreutils는 타임 스탬프 앞에.를 붙여 타임 스탬프를 넣을 수 있습니다 @.

그래서 이것을 시도하십시오

touch -d @$ORIGTS $f

시대를 초월한 이후의 coreutils-초 참조


아, 내가 지금 리눅스에서 본 타임 스탬프를 많이 설명합니다! 고마워요
팀 알렉산더

8

touch-r옵션을 사용하여 파일의 타임 스탬프를 사용할 수 있습니다 . 다른 파일로 출력하고 싶을 수도 있습니다 (아래 -if는 입력 파일이고 -of출력 파일 이라고 가정 합니다)

for f in ...; do
    sudo /opt/ABBYYOCR9/abbyyocr9 ... -if $f ... -of $f.new
    touch -r $f $f.new
    mv $f.new $f
done

피하기 위해 +1 stat.
l0b0

3

IFS=$(echo -en "\n\b")

를 사용하여 쉘을 가정하고 echo -e어쨌든 shebang 라인에 bash가 있으므로을 사용할 수 있습니다 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줄 바꿈으로 설정 하면 줄 바꿈으로 출력이 분할되지만 줄 바꿈이 포함 된 파일 이름은 여전히 ​​처리 할 수 ​​없습니다.
  • 명령 대체의 결과는 단어로 분할 될뿐만 아니라 각 단어가 glob 패턴으로 사용됩니다. 당신이라는 파일을 경우 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그 이후로 변경되지 않았고 globbing이 해제 된 경우 필요하지 않지만 실제로는 할 수없는 이유가없는 한 항상 큰 따옴표를 넣습니다. ' 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"' {} \;

0

어떤 이유로 나는에 대한 대답을 놓쳤다 touch -r. 이상한 이유로 당신 stat이 받아 들여진 대답에서와 같이 GNU coreutils를 가지고 있지 않거나 사용할 수 없다면 , BSD와 비슷한 형식으로 touch -r타임 스탬프를 얻는 방법은 다음 touch과 같습니다 stat.

% /usr/bin/stat -f '%Sm' johnson                   
Oct 23 22:51:00 2012
% /usr/bin/stat -t '%Y%m%d%H%M.%S' -f '%Sm' johnson
201210232251.00
% touch foo
% touch -t $(/usr/bin/stat -t '%Y%m%d%H%M.%S' -f '%Sm' johnson) foo
% /usr/bin/stat -f '%Sm' foo                    
Oct 23 22:51:00 2012

그러나 실제로 다음을 사용하십시오 touch -r.

% touch foo
% touch -r johnson foo
% /usr/bin/stat -f '%Sm' foo
Oct 23 22:51:00 2012

0

'영화 제작'과정에서 나온 것과 같은 문제가있었습니다.

아래 예 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반전 된 틱으로 원본 파일의 생성 타임 스탬프를 유닉스 시대 시간 (초)으로 제공합니다. @ from coreutils는이를 dateYYYYMMDDHHmm.SS로 이해하고 다시 포맷 할 수 있는 iso 날짜로 변환 하므로 touch이해할 수 있습니다. 나는 date같은 명령에서 재사용 할 수 없기 때문에 반전 된 틱과 동등한 $ ()에 명령을 넣었습니다 .


(1) 이것은 Nicholas Riley의 대답 과 거의 동일 하지만 더 복잡해 보입니다 . 왜 누군가가 이것을 사용하지 않고 (또는 더 나은 glenn jackman 's answer ) 사용하고 touch -r싶습니까? (2)  stat 넣을 수 있습니다 $(…); 하나의 명령으로 여러 번 사용할 수 있습니다.
G-남자 '는 분석 재개 모니카'말한다

시간을 만들지 않고 수정 시간을 사용하는 그의 대답 외에는 옳은 것 같습니다. 나는이 다른 대답을 보지 못했습니다. 당신은 내 투표를 할 수 있습니다.
dominikz

글쎄, 당신이 부탁하면 재미 없어요. :-) ⁠
G-Man, 'Reinstate Monica'라고
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.