BASH에서 mv를 사용하여 파일 이름에 타임 스탬프 추가


82

글쎄, 나는 리눅스 초보자이고 간단한 bash 스크립트에 문제가 있습니다.

실행되는 동안 로그 파일에 추가하는 프로그램이 있습니다. 시간이 지남에 따라 로그 파일이 커집니다. 각 실행 전에 로그 파일의 이름을 바꾸고 이동하여 프로그램의 각 실행에 대해 별도의 로그 파일을 효과적으로 만드는 시작 스크립트를 만들고 싶습니다. 지금까지 얻은 내용은 다음과 같습니다.

페이스트 빈

DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program

실행하면 다음이 표시됩니다.

: command not found
program

logs 디렉토리로 이동하여 dir을 실행하면 다음과 같이 표시됩니다.

201111211437\r.log\r

무슨 일이야? 내가 놓친 구문 문제가 있다고 가정하고 있지만 알아낼 수없는 것 같습니다.


업데이트 : 아래 셸터의 의견 덕분에 Windows에서 메모장 ++의 .sh 파일을 편집 한 다음 ftp를 통해 서버로 보내고 ssh를 통해 파일을 실행한다는 사실로 인해 문제가 발생했습니다. . 파일에서 dos2unix를 실행하면 작동합니다.

새로운 질문 : 파일을 다시 보낼 때마다이 수정을 수행하지 않으려면 처음에 파일을 올바르게 저장하려면 어떻게해야합니까?


2
\r캐리지
리턴

캐리지 리턴은 어디에서 오나요? 나는 뭔가 logs/$DATE.log잘못되었다고 생각하지만 입력 echo logs/$DATE.log하면 올바른 경로가 출력 됩니다 .
Cat5InTheCradle 2011

내가 어떻게 알 겠어? 맞습니다 bash는 스크립트를 첨부 해주세요 가능성이 눈에 띄지 whitepspaces이
ajreal

메인 포스트에 pastebin 링크를 추가했지만 그 코드 조각은 말 그대로 전체 스크립트입니다. Java .jar을 시작하는 줄을 '에코 프로그램'으로 대체했습니다.
Cat5InTheCradle

잘 모르겠습니다 ... 정확한 것 같습니다. DATE=$(date +"%Y%m%d%H%M")? 뒤에 문자열을 추가하는 것은 어떻습니까?
ajreal

답변:


24

대본에서 게시 한 몇 줄은 괜찮아 보입니다. 아마도 조금 더 깊은 것 같습니다.

이 오류를 제공하는 줄을 찾아야합니다. set -xv스크립트 맨 위에 추가하십시오 . 이것은 STDERR 에 실행되는 라인 번호와 명령을 인쇄합니다 . 이렇게하면 스크립트에서이 특정 오류가 발생하는 위치를 식별하는 데 도움이됩니다.

BTW, 스크립트 상단에 shebang이 있습니까? 이와 같은 것을 볼 때 일반적으로 Shebang에 문제가 있다고 예상합니다. 예를 들어 #! /bin/bash맨 위에 있지만 bash 인터프리터가에있는 /usr/bin/bash경우이 오류가 표시됩니다.

편집하다

새로운 질문 : 파일을 다시 보낼 때마다이 수정을 수행하지 않으려면 처음에 파일을 올바르게 저장하려면 어떻게해야합니까?

두 가지 방법:

  1. 선택 편집 -> EOL 변환 -> 유닉스 포맷 은 파일을 편집 할 때 메뉴 항목을 선택합니다. 올바른 줄 끝이 있으면 메모장 ++에서 그대로 유지합니다.
  2. 모든 새 파일에 올바른 줄 끝이 있는지 확인하려면 설정-> 기본 설정 메뉴 항목으로 이동 하여 기본 설정 대화 상자를 엽니 다. 새 문서 / 기본 디렉토리 탭을 선택합니다 . 에서 새 문서형식 , 선택 유닉스 라디오 버튼을 누릅니다. 닫기 버튼을 클릭 합니다.

시도해 볼 수있을 것입니다. 파일이 내 Linux 서버에 ftp 된 후 dos2unix를 실행하면 문제가 해결되지만 추가 단계에 대한 방법을 찾고 있습니다. 나는 처음에 shebang이 없습니다. 그것이 열쇠 일 수 있습니다.
Cat5InTheCradle 2011

1
@AgentSnazz-아하! 그게 문제입니다. Unix 쉘 스크립트에는 Unix 줄 끝이 있어야합니다. Windows / MS-DOS는 캐리지 리턴 줄 바꿈 (CRLF 또는 \ r \ n이라고도 함)을 사용하여 줄의 끝을 표시합니다. Unix는 줄 바꿈 (일명 LF 또는 \ n) 만 사용합니다. Windows 컴퓨터에서 Unix 용 파일을 편집하는 경우 올바른 줄 끝을 수행 할 수있는 프로그램 편집기 (예 : Vim 또는 Notepad ++ . Notepad를 사용하지 마십시오 . 이것이 \r파일 이름 에이 표시되는 이유)를 사용해야 합니다. \r프로그램의 각 줄 끝에는 보이지 않는 것이 있습니다
David W.

79
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log

16
date +"%Y%m%d%H%M"당신의 배쉬가 조금 다른 경우
zinking

6
의 zinking 점 @ 강조하고, 거기에 있어야 하지 a를 기호 플러스와 따옴표 사이의 공간이 될
PUK

9

bash 내의 한 줄 메서드는 이와 같이 작동합니다.

[일부 출력]> $ (date "+ % Y. % m. % d- % H. % M. % S"). ver

확장자가 ver 인 타임 스탬프 이름으로 파일을 생성합니다. 다음과 같이 날짜 스탬프 파일 이름에 스냅 샷을 나열하는 작업 파일은 작동을 보여줄 수 있습니다.

find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver

물론이야

cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver

또는 더 간단

ls > $(date "+%Y.%m.%d-%H.%M.%S").ver


5

간단한 파일 회전에이 명령을 사용합니다.

mv output.log `date +%F`-output.log

로컬 폴더에 2019-09-25-output.log


4

글쎄, 그것은 당신의 질문에 대한 직접적인 대답은 아니지만, GNU / Linux에는 로그 파일을 정기적으로 회전 시켜서 오래된 파일을 일정한 한계까지 압축하는 도구가 있습니다. 이것의logrotate


나는 그것을 볼 것이다. 그것은 자체 로그 파일에서 프로그램의 각 실행을 멋지게 포장하기 때문에 내 방법을 좋아한다.
Cat5InTheCradle 2011

1

메모장에서 스크립트를 작성할 수 있지만 다음을 사용하여 변환하십시오-> $ sed -i 's / \ r $ //'yourscripthere

나는 cygwin에서 일할 때 항상 그것을 사용하고 작동합니다. 도움이 되었기를 바랍니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.