백업 파일 이름에 날짜를 추가하는 방법

백업 파일 이름에 날짜를 추가하는 방법

파일을 백업해야 하는데, 쉽게 구별할 수 있도록 타임스탬프를 이름의 일부로 포함하고 싶습니다.

복사 명령에 현재 날짜를 삽입하는 방법은 무엇입니까?

[root@mongo-test3 ~]# cp foo.txt {,.backup.`date`}
cp: target `2013}' is not a directory

[root@mongo-test3 ~]# cp foo.txt {,.backup. $((date)) }
cp: target `}' is not a directory  

[root@mongo-test3 ~]# cp foo.txt foo.backup.`date`
cp: target `2013' is not a directory

답변1

date명령이 공백이 포함된 문자열을 반환하기 때문에 이는 작동하지 않습니다 .

$ date
Wed Oct 16 19:20:51 EDT 2013

정말로 이와 같은 파일 이름을 원한다면 문자열을 따옴표로 묶어야 합니다.

$ touch "foo.backup.$(date)"

$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:22 foo.backup.Wed Oct 16 19:22:29 EDT 2013

하지만 내 생각에는 다른 문자열을 추가하는 것을 고려할 수도 있습니다. 나는 보통 다음과 같은 것을 사용합니다 :

$ touch "foo.backup.$(date +%F_%R)"
$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:25 foo.backup.2013-10-16_19:25

보다날짜 매뉴얼 페이지날짜 및 시간 출력을 위한 추가 형식 지정 코드입니다.

추가 형식

모든 권한을 갖고 싶다면 매뉴얼 페이지를 참조하여 다음을 수행할 수 있습니다.

$ date +"%Y%m%d"
20131016

$ date +"%Y-%m-%d"
2013-10-16

$ date +"%Y%m%d_%H%M%S"
20131016_193655

노트:date -I또는 를 사용하여 date --iso-8601와 동일한 출력을 생성 할 수 있습니다 date +"%Y-%m-%d. 스위치는 또한 걸릴 수 있습니다다양한 시간 형식을 나타내는 매개변수:

$ date -I=?
date: invalid argument ‘=?’ for ‘--iso-8601’
Valid arguments are:
  - ‘hours’
  - ‘minutes’
  - ‘date’
  - ‘seconds’
  - ‘ns’
Try 'date --help' for more information.

예:

$ date -Ihours
2019-10-25T01+0000

$ date -Iminutes
2019-10-25T01:21+0000

$ date -Iseconds
2019-10-25T01:21:33+0000

답변2

cp foo.txt {,.backup.`date`}

이것 은 그런 것으로 확장 됩니다 cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013. 중괄호 앞의 공백은 새 단어를 시작합니다.

cp foo.txt {,.backup. $((date)) }

중괄호는 별도의 단어이므로 문자 그대로 해석됩니다. 게다가 $((…))산술 확장의 구문은 date산술 표현식의 구문과 완전히 다릅니다. 명령 대체에서는 괄호 세트를 사용합니다: $(date).

cp foo.txt foo.backup.`date`

더 가까이. 이를 중괄호로 표현할 수 있습니다 cp foo.{txt,.backup.`date`}. 출력에 공백이 포함되는 문제가 여전히 있으므로 date큰따옴표로 묶어야 합니다. 이것은 작동합니다:

cp foo.{txt,backup."`date`"}

또는

cp foo.{txt,backup."$(date)"}

기본 출력 형식은 date파일 이름에 적합하지 않으며, /로케일이 기본 출력 형식의 문자를 사용하는 경우에도 작동하지 않을 수 있습니다. 파일 이름의 사전순 순서가 시간순이 되도록 YMD 날짜 형식을 사용합니다(또한 미국 날짜 형식과 국제 날짜 형식 간의 모호성을 방지하기 위해).

cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}

답변3

정말로 자세한 날짜를 사용하려면 백틱을 보호해야 합니다. 이 날짜 형식의 단점은 공백이 포함되어 있다는 것입니다. 공백은 따옴표 안에 넣지 않는 한(또는 다른 방법으로 이스케이프 처리하지 않는 한) Unix 쉘에서는 허용되지 않습니다.

cp foo.txt "foo-`date`.txt"

그러나 나는 더 짧은 ISO 형식을 사용하는 것을 선호합니다.

cp foo.txt foo-`date --iso`.txt

답변4

기본적으로 출력에 공백이 있기 때문에 date이전 명령이 실패했습니다 . 마지막 매개변수를 인용하면 "작동합니다. 다른 시도는 구문 오류일뿐입니다.

공백 없이 가능한 해결 방법은 다음과 같습니다.

cp foo.txt foo.backup.$(date --iso-8601=seconds)  

또는

cp foo.txt foo.backup.`date --iso-8601=seconds`

추가하면

bk() {
     cp -a "$1" "${1}_$(date --iso-8601=seconds)"
}

당신에게 .bashrc다시 로그인하거나 bash가 그것을 다시 읽도록 하십시오 bk file.txt. .

관련 정보