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


69

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

현재 날짜를 복사 명령에 어떻게 삽입 하시겠습니까?

[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

답변:


108

명령 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

+1-항상 날짜에 "% Y % m % d- % H % M % S"또는 "% y % m % d- % H % M % S"형식 지정자를 사용합니다.
ChuckCottrill

그냥 touch foo`date +%F`도 잘 작동합니다.
Vadzim

경고 : 이것은 csh쉘 에서 작동하지 않습니다
Govinda Sakhare

1
@ GovindaSakhare-csh / tcsh는 서브 쉘 표기법을 ...대신 백틱 (( ))으로 전환합니다 $(..). C 쉘은 분명히 서브 쉘에 대한 표기법을 지원하지 않습니다.
slm

13
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)"}

마지막으로 나에게 cp를 주었다 : target`foo..backup.20160913-134158 '는 디렉토리가 아니다
Kalpesh Soni

@KalpeshSoni 내가 게시 한 정확한 명령으로이 오류 메시지를 생성 할 수 없습니다. 다른 명령을 사용해야합니다.
Gilles

10

자세한 날짜를 사용하려면 백틱을 보호해야합니다. 이 날짜 형식은 공백을 포함하고 있으며, 따옴표 안에 넣지 않으면 (또는 다른 방법으로 이스케이프 처리하지 않는 한) 유닉스 쉘에는 없습니다.

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

그러나 더 짧은 ISO 형식을 사용하는 것이 좋습니다.

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

5

기능을 사용하면 인생이 더 쉬워집니다. 이것이 내가 사용하는 것입니다 :

backup () { 
    for file in "$@"; do
        local new=${file}.$(date '+%Y%m%d')
        while [[ -f $new ]]; do
            new+="~";
        done;
        printf "copying '%s' to '%s'\n" "$file" "$new";
        \cp -ip "$file" "$new";
    done
}

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다시 로그인 / 배쉬를 다시 읽게하려면을 호출하면 bk file.txt됩니다.


RHEL 날짜 매뉴얼에 --iso-8601스위치 가 표시되지 않으므로 여기에 링크를 넣으십시오. GNU 날짜 옵션 : --iso-8601
Ivan Chau

3

타임 스탬프가 추가 된 이름의 백업 파일로 파일을 복사합니다.

cp foo.txt backup_`date +"%d-%m-%Y"`.txt

또는:

"cat"을 사용하여 파일 내용을 표시하고 타임 스탬프가 추가 된 이름을 가진 백업 파일로 출력을 리디렉션 할 수 있습니다.

cat foo.txt > backup_`date +"%d-%m-%Y"`.txt

필요에 따라 더 많은 FORMAT 컨트롤 옵션을 사용할 수도 있습니다 (예 : % H, % M, % S 등).


cat리디렉션보다 장점은 무엇입니까 cp?
귀도

그것은 대체 방법입니다
Atul Rokade

1

bash에서 다음을 입력 할 수 있습니다.

cp /path/to/long/filename !#$_$(date +Is)

다음으로 확장 :

cp /path/to/long/filename /path/to/long/filename_$(date +Is)

를 야기하는:

$ ls /path/to/long/filename*
filename  filename_2017-05-10T11:50:10+0300

소고기 date -Is. 기억하기 쉽고 타이핑하고 짧은 버전 ( -In정확한 괴물 인 경우)을 허용하기 때문에 사용하는 것이 좋습니다.


! 이벤트 지정자를 시작합니다.

 !#     The entire command line typed so far.

그리고 $단어 지정자입니다.

   $      The last word.  This is usually the last argument, but will expand to the zeroth word if there is only one word in the line.

1

파일을 백업해야 할 때 일반적으로이 방법으로 수행합니다.

cp foo.txt foo.backup.$(date +%F).txt

ls -l

foo.txt foo.backup.2017-9-19.txt


1
이것은 다른 답변이 아직 제기하지 않은 것을 추가합니다. 또한 %F날짜 형식은 2 자리 월을 생성하며 ls -l일반적으로 파일 이름보다 약간 더 많은 정보를 제공합니다.
Kusalananda

0

파일이나 디렉토리의 백업을 원한다면 대상을 입력 해야하는 이유는 셸 확장을 사용하여 날짜를 복사 파일 이름 끝에 추가하십시오.

cp filename.sh{,."`date`"}

결과

filename.sh.Sun 29 Sep 00:44:43 BST 2019

또는 단순히 사용

cp filename{,.20190929}

filename.sh.20190929

필요에 맞게 날짜를 추가하십시오. :)

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