변수에서 파일 이름으로 현재 날짜 추가


55

다음과 같이 파일 이름 끝에 현재 날짜를 추가하려고합니다.

TheFile.log.2012-02-11

여기 내가 지금까지 가지고있는 것입니다 :

set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &

그러나 내가 얻는 것은 파일 이름이며 아무것도 추가하지 않습니다. 파일 이름에 현재 날짜를 어떻게 추가합니까?


날짜를 적용 할 때는 :rsync 및 scp에서 호스트로 읽히므로 사용하지 마십시오 . stackoverflow.com/a/37143274/390066
kirill_igum

답변:


78

아마 당신의 사용입니다 set. 그러면 '오늘', '='및 date프로그램 의 출력이 위치 매개 변수 (일명 명령 행 인수)에 지정됩니다. 당신은 C 쉘 (이것을 "bash"로 태그하고 있기 때문에)을 사용하고 싶을 것이다.

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire

등호 주위에 공백이 없는지 확인하십시오.

당신은 또한 &당신의 진술의 끝에 사용하고 싶지 않습니다 ; 셸이 명령이 완료되기를 기다리지 않습니다. 특히 다음에 의존 할 때. find는 이전에 시작되기 때문에 명령이 실패 할 수 있습니다 mkdir.


그 동료, 고맙게도 % 100 괜찮아, 헤드 업 및 mkdir을위한 건배
I AM L

55

파일 이름에 날짜를 삽입하는 배쉬 스크립트 :

이 파일의 bash 코드는 a.sh

#!/bin/bash
today=`date '+%Y_%m_%d__%H_%M_%S'`;
filename="/home/el/myfile/$today.ponies"
echo $filename;

실행하면 다음을 인쇄합니다.

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

코드 설명 :

스크립트를 / bin / bash 인터프리터로 해석하십시오. 오늘이라는 새 변수를 만듭니다. 날짜 명령을 실행하여 Y, m, d, H, M, S 플래그를 전달하여 출력을 구성하십시오. 결과를 날짜 변수에 넣습니다.

filename이라는 새 변수를 만들고 $ today 변수를 나머지 정적 파일 이름 텍스트로 묶습니다. 그런 다음 파일 이름을 화면에 에코하십시오.

lulz를 늘리려면 하나의 라이너로 넣습니다.

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"

5

여러 가지를 섞은 것 같습니다.

set today = 'date +%Y'tcsh 구문처럼 보이지만 tcsh에서도 문자열 date +%Y을 변수에 할당 today하면 date명령이 실행되지 않습니다 . bash 또는 다른 POSIX 셸을 사용하고있을 때 할당 구문은 today=some_value(등호 주위에 공백이 없음)입니다. 명령을 실행하고 출력을 변수에 지정하려면 명령 대체를 사용하십시오 .

today=$(date +%Y-%m-%d)

(날짜 사양도 완성했습니다). 대신 달러 괄호 역 인용 부호를 사용할 수 있지만 앞으로 따옴표 시각적으로 혼동에 발생하기 쉬운, 그리고 당신이 backquoted 명령 안에 따옴표를 필요로 할 때의 규칙은 매우 복잡하고 구현에 의존하는, 그래서에 충실하지 낫다 $(…)(이 saner 구문과 동일한 효과가 있습니다).

&여러 명령 끝에 사용 했습니다. 따라서 백그라운드에서 명령이 실행되므로 여기서는 원하지 않습니다. 나는 당신 &&이 첫 번째 명령이 성공한 경우에만 다음 명령을 실행하는 것을 의미한다고 생각합니다 .

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find 

&&각 명령 다음 에 사용하는 대안 은로 스크립트를 시작하는 것입니다 set -e. 이것은 명령이 0이 아닌 상태를 리턴하자마자 ( if조건의 경우와 몇 가지 다른 경우를 제외하고) 스크립트 실행을 중지하도록 쉘에 지시합니다 .

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find 

당신의 find명령은 훌륭하지만 아마도 당신이하려는 일을하지 않을 것입니다 (그러나 그것이 무엇인지 확실하지는 않지만).

로 디렉토리를 생성 한 mkdir다음 즉시로 트래버스합니다 find. 디렉토리가 이미 존재하지 않으면 유용하지 않습니다. 오늘 로그를위한 디렉토리를 만들고 최근 파일을 The_Logs예를 들어 The_Logs.2012-02-11?

mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;

아니면 오늘의 로그 파일 이름을 바꾸어 접미사를 추가 $today했습니까? 이동하려면 각 파일마다 다른 파일 이름을 계산해야합니다.

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;

내가 사용합니다 -mtime자신의 수정 시간을 기준으로 파일을 이동하지, -atime그렇지 않은 경우에 atime은 멀리 다시 같은 수 있습니다 - 시스템이 그의를 추적하면 (파일이 마지막으로 읽은 시간이다, mtime).


3

타임 스탬프가 추가 된 파일의 이름을 바꿀 수 있습니다

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`

2

이:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

작동해야합니다. 비록 당신이 csh를 사용하고있는 것처럼 보이지만 + 기호를 제거하는 해결책이 효과가 없을 수도 있지만 시도해 보는 것은 아프지 않습니다. 변수를 {} 중괄호로 묶는 것은 항상 예기치 않은 변수 확장을 방지하는 것이 좋습니다.


고마워 친구, 다른 답변으로 수정 사항을 추가 한 후 제대로 작동합니다.
나는 오전
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.