파일을 백업해야 하는데, 쉽게 구별할 수 있도록 타임스탬프를 이름의 일부로 포함하고 싶습니다.
복사 명령에 현재 날짜를 삽입하는 방법은 무엇입니까?
[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
. .