MD5를 변경하기 위해 여러 번 실행하더라도 파일 끝에 1개의 문자열을 추가합니다.

MD5를 변경하기 위해 여러 번 실행하더라도 파일 끝에 1개의 문자열을 추가합니다.

파일의 md5를 때로는 한 번, 때로는 여러 번 변경해야 합니다. 친구가 나에게 파일 끝에 문자열을 추가하기 위해 이 스크립트를 주었지만 나는 그것을 여러 번 추가할 것이라고 생각했고 16진수 편집기를 볼 때 두 번 보았습니다. 이것이 실제로 다른 것을 편집하고 있는지 확실하지 않습니다. 사용을 시작하기 전에 확인해 보고 싶었습니다.

#!/bin/sh
echo "md5change`date +%s`"
cat $1 | sed --in-place '/md5change/s/.*//' $1
sed -i '/^[ \t]*$/d' $1
echo "md5change`date +%s`" >> $1
echo "done"

감사해요

답변1

스크립트는 "md5change"라는 문자열을 포함하는 파일에 줄이 있다고 가정하는 것 같습니다. 화면에 이와 같은 문자열을 표시하고 해당 문자열이 포함된 줄을 지운 다음(삭제하지는 않음) 파일의 모든 빈 줄을 삭제하고 마지막으로 파일에 새 "md5change" 줄을 추가합니다(반드시 일치하지는 않음). 하나를 표시 echo하고 마지막으로 "완료"를 인쇄합니다. 하지만 해당 cat $1 |부분 $1은 이미 "in-place" 매개변수로 렌더링되었으므로 제거해야 합니다 sed.

편집: 다음과 같이 코드를 압축할 수 있다고 생각합니다.

timestamp=md5change$(date +%s)
echo "${timestamp}"
sed -i "/md5change/s/.*/${timestamp}/" "$1"
echo "done"

(참고: 이 코드는 파일의 모든 빈 줄을 제거하고, 파일에서 여러 "md5change" 항목을 제거하고, 파일 끝에 추가하기 때문에 코드 템플릿과 동일하지 않습니다. 이 압축 버전은 기존의 "md5change"를 변경합니다. " "항목은 새 항목으로 구성됩니다. 제 생각에는 이것이 여러분이 정말로 원하는 것이며 원본 코드의 일부 문제를 수정한 것 같습니다.)

답변2

거의 다 왔어요! 선택한 도구를 사용하는 한 줄 솔루션은 다음 sed과 같습니다 date.

$ sed -i "s/^md5change.*/md5change$(date +%s)/" FILE

왜 두 번째 명령을 원하는지 모르겠습니다 (비 GNU에서는 이를 인식하지 못할 수도 있지만 sed공백이 아닌 문자가 누락된 모든 줄을 제거합니다 ). GNU를 가정하고 참조 섹션 끝에 추가하십시오. GNU가 없으면 이스케이프된 버전을 리터럴 탭으로 바꾸십시오.sed\t; /^[ \t]$/d

아직 "md5change" 줄이 없으면 한 줄 코드가 작동하지 않습니다. 이렇게 하려면 먼저 다른 줄이 필요합니다.

#!/bin/sh
epoch=$(date +%s)
if grep ^md5change "$1"
  then sed -i "s/^md5change.*/md5change$epoch/" "$1"
  else echo "md5change$epoch" >> "$1"
fi

 

이는date +%s아니요가지고 다닐 수 있는! POSIX 표준은 이를 지정하지 않지만 GNU 및 BSD 버전 모두 date지원합니다. perl -e "print time"실제 언어(예: )를 사용하여 모든 논리를 수행 할 수 있습니다 perl.

#!/usr/bin/perl -i -pn
$_ = $1 . time . "\n" if /^(md5change)/

$1이는 "md5change"로 시작하는 줄을 찾아 이를 에포크("md5change")와 연결된 일치하는 부분과 개행 문자로 바꿉니다. -i입력을 덮어쓰고( 와 sed -i동일 ) sed --in-place현재 행을 나타내는 기본 변수( )를 사용하여 -n입력의 각 행을 반복 하고 명령 끝에 (각 행)을 인쇄합니다.$_-p$_-e

빈 줄을 제거하려면 Perl의 -pn인수를 다음으로 변환 -n하고 끝에 다음과 같은 새 줄을 추가하십시오.print if /\S/

명령줄에서 이 스크립트를 한 줄 스크립트로 변환할 수도 있습니다.

$ perl -i -pne '$_ = $1 . time . "\n" if /^(md5change)/'

또는

$ perl -i -ne '$_ = $1 . time . "\n" if /^(md5change)/; print if /\S/'

"md5change" 행이 누락된 입력 파일을 처리하려면 다음을 수행하십시오.

#!/usr/bin/perl -i
my $md5change = 0;
while (<>) {
  if (/^(md5change)/) {
    $_ = $1 . time . "\n";
    $md5change = 1;
  }
  print;
} continue {
  if (eof and not $md5change) {
    $md5change = 0;
    print "md5change" . time . "\n";
  }
}

관련 정보