다음과 같이 파일 이름 끝에 현재 날짜를 추가하려고 합니다.
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" \; &
그러나 내가 얻는 것은 파일 이름뿐이며 파일에 아무것도 추가되지 않습니다. 파일 이름에 현재 날짜를 추가하는 방법은 무엇입니까?
답변1
아마도 를 사용했을 것입니다 set
. 이는 "today", "=" 및 프로그램의 출력을 date
위치 인수(명령줄 인수라고도 함)에 할당합니다. C 셸을 사용하고 싶다면("bash"로 표시했기 때문에 그렇지 않을 가능성이 높음) 다음을 사용해야 합니다.
today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire
등호 주위에 공백이 없다는 점에 유의하세요.
&
또한 명령문 끝에 이를 사용 하지 않으려면 쉘이 명령이 완료될 때까지 기다리지 않게 됩니다. 특히 한 사람이 다른 사람에게 의존하는 경우에는 더욱 그렇습니다. find
에 있기 때문에 명령이 실패할 수 있습니다 mkdir
.
답변2
파일 이름에 날짜를 삽입하는 Bash 스크립트:
파일의 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 해석기를 사용하십시오. "오늘"이라는 새 변수를 만듭니다. date 명령을 실행하고 Y, m, d, H, M, S 플래그를 전달하여 출력을 구성합니다. 결과를 날짜 변수에 넣습니다.
filename이라는 새 변수를 만들고 $today 변수를 나머지 정적 파일 이름 텍스트로 묶습니다. 그러면 파일 이름이 화면에 표시됩니다.
추가된 lulz를 위해 이것을 한 줄에 넣습니다:
echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"
답변3
몇 가지 사항을 혼동하신 것 같습니다.
set today = 'date +%Y'
tcsh 구문과 비슷해 보이지만 tcsh에서도 문자열을 date +%Y
변수에 할당 today
하지만 명령을 실행하지는 않습니다 date
. 아마도 bash나 다른 POSIX 쉘을 사용하고 있을 것이므로 할당 구문은 다음과 같습니다 today=some_value
(등호 주위에 공백 없음). 명령을 실행하고 해당 출력을 변수에 할당하려면 다음을 사용하십시오.명령 대체:
today=$(date +%Y-%m-%d)
(날짜 지정도 완료했습니다.) 달러 괄호 대신 백틱을 사용할 수 있지만 앞 따옴표와 시각적으로 쉽게 혼동될 수 있으며 백틱 명령 내에서 따옴표를 사용해야 하는 경우에 대한 규칙은 복잡하고 구현에 따라 다르므로 고집하지 않는 것이 가장 좋습니다 $(…)
( 더 정상적인 문법을 사용하면 동일한 효과가 있습니다).
&
여러 명령의 끝에 사용했습니다 . 이렇게 하면 여기서는 필요하지 않은 명령이 백그라운드에서 실행됩니다. &&
첫 번째 명령이 성공한 경우에만 다음 명령을 실행한다는 뜻이라고 생각합니다 .
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은 그보다 빠를 수 있음).
답변4
이것:
find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &
작동해야합니다. 비록 당신이 csh를 사용하고 있는 것 같으며 + 기호를 제거하는 내 솔루션이 효과가 없을 수도 있지만 시도해 보는 것도 나쁘지 않습니다. 우발적인 변수 확장을 방지하려면 항상 변수를 {} 중괄호로 묶는 것이 좋습니다.