디렉토리를 tar하고 디렉토리를 포함하여 원본을 제거하는 방법?


30

tar'my_directory'라는 디렉토리에있는 파일 모음을 찾으려고 명령을 사용하여 원본을 제거하려고합니다.

tar -cvf files.tar my_directory --remove-files

그러나 디렉토리 자체가 아닌 디렉토리 내부의 개별 파일 만 제거합니다 (명령에서 지정한 것). 내가 여기서 무엇을 놓치고 있습니까?

편집하다:

예, 'remove-files'옵션이 상당히 리터럴이라고 가정합니다. 나는 그 시점에서 맨 페이지가 불분명하다는 것을 알았지 만. (리눅스에서는 디렉토리와 파일을 많이 구별하지 않는 경향이 있으며 때로는 같은 것이 아니라는 것을 잊어 버립니다). 합의는 디렉토리를 제거하지 않는다는 것입니다.

그러나이 질문을하기위한 주요 프롬프트 포인트는 tar가 절대 경로를 처리하는 것에서 비롯됩니다. 압축 할 파일의 상대 경로를 지정해야하므로 상위 디렉토리로 변경하여 파일을 적절하게 변경해야합니다. 내가 볼 수 있듯이 모든 종류의 후속 'rm'명령을 사용하면 해당 상황에서 잠재적으로 위험합니다. 따라서 타르 자체를 제거하여 작업을 단순화하기를 바랐습니다.

예를 들어, 백업 할 디렉토리 (예 : tar)가 쉘 변수로 포함 된 백업 스크립트를 상상해보십시오. 해당 쉘 변수 값을 잘못 입력 한 경우 마지막에 발생한 디렉토리에서 파일을 삭제할 수 있습니다.


니콜라스, 추가 단계에서 디렉토리 트리를 제거해야 할 위험이 있다는 주장은 절대적으로 유효합니다. 아카이버가 안전하게이 작업을 수행 할 수 있어야한다고 생각합니다. 또한 이것이 GNU tar 제작자의 의도라고 생각합니다. 적어도 ;-)이어야합니다.
mit

2
--remove-files 옵션은 실제로 적어도 일부 플랫폼 / 일부 버전에서-포함하는 디렉토리를 제거한다는 것을 알았습니다. 귀하의 경우 나머지 파일은 tar 후 변경된 일부 파일로 인해 완전히 비어 있지 않을 수 있습니다.
isync

@ isync 우분투 14.04에서 디렉토리를 삭제하는 --remove-files가 발생하는 것 같습니다. 내 경우를 제외하고는 원하지 않습니다. 하하
브래들리 오델 1

답변:


12

--remove-files옵션이 파일 을 아카이브에 추가 한 후 제거 한다는 옵션 이 누락되었습니다 .

다음과 같은 명령으로 아카이브 및 파일 제거 작업을 수행 할 수 있습니다.

/ path / to / be / archived / -depth -type d -empty -exec rmdir {} \;를 찾으십시오.


업데이트 :
버그 424692 에 대한이 짧은 데비안 토론에 관심이있을 수 있습니다 . --remove-files는 디렉토리가 "읽을 때 변경됨"을 불평합니다 .


어쩌면 실제로 : 작업을 시작 -c하기 전에 디렉토리를 변경 tar합니다 (그리고 완료 될 때까지 종류가 반환되지 않습니까)? 내가 생각 하는이 아카이브에 포함 된 경우는 하위 디렉토리를 삭제 한 것이다 (그러나 나는 것을 테스트하지 않았습니다).
Arjan

@Arajan, 나는 ' c'이것과 관련이 없다고 생각 합니다. 'remove-files'의도적으로 디렉토리를 제거하지 않습니다.
nik

Aha, 나는 man페이지 에서 "아카이브에 파일을 추가 한 후 파일을 제거하십시오"라는 간단한 설명을 그다지 명확하지 않지만 당신이 옳다고 생각합니다. 그럼에도 불구하고, 나는에 대해 언급 한 디렉토리 기대하지 않는 게 좋을 -c심지어 제거하는 경우 tar 뿐만 아니라 제거 디렉토리했다입니다. (나에게 그것은 현재 디렉토리를 제거하는 것과 같을 것입니다. 따라서 아카이브 자체를 포함하여 사용 하지 않을-c...?) 그러나 -remove-files항상 디렉토리를 그대로 두면 여기에 문제가 발생합니다. ;-)
Arjan

3
--remove-files버그가 수정되었습니다 tar-1.19.
x-yuri

19

--remove-files옵션 은 파일제거 하므로 시도해 볼 수 있습니다

tar -cvf files.tar my_directory && rm -R my_directory

디렉토리가 tar종료 상태 0을 리턴하는 경우에만 디렉토리가 제거되도록


9
rm을하기 전에 tar의 종료 상태를 확인해야합니다! 그렇지 않으면 타르 아카이브와 파일이 없을 수도 있습니다.
Kim

1
하나의 레벨 디렉토리를 사용하는 경우 빈 디렉토리 만 제거하므로 'rm'대신 'rmdir'을 사용하는 것이 안전합니다. [질문 편집 참조]
Nicholas

그러나 디렉토리 rmdir만 제거합니다 . 아이디어는 디렉토리 그 안의 파일 을 제거하는 것입니다 (제공된 경우)tar
pavium

--remove-files버그가 수정되었습니다 tar-1.19.
x-yuri

&&는 이전 명령이 0 (성공)을 종료 한 경우에만 다음 명령을 실행합니다. > 0을 초과하면 다음 명령이 실행되지 않습니다. ||로 역순으로 바꿀 수도 있습니다. -첫 번째 명령이 실패한 경우에만 실행하십시오. 끔찍한 콘텐츠 검사를 수행하는 좋은 방법은 그 중 하나입니다.
Kirrus

6

아카이브 이름 뒤에 --remove-files 지시문을 넣으려고 했습니까? 그것은 나를 위해 작동합니다.

tar -cvf files.tar --remove-files my_directory

1
이 질문이 제기 된 이후 tar의 동작이 변경되었을 가능성이 높습니다. 나에게, --remove-files전후 에 퍼팅에 차이가 없다 my_directory; 두 경우 모두 디렉토리가 제거됩니다.
redburn

5
--remove-files버그가 수정되었습니다 tar-1.19.
x-yuri

1
source={directory argument}

예 :

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

예 :

parent={ABSOLUTE PATH of 'my_directory'/

 

logFile={path to a run log that captures status messages}

그런 다음 라인을 따라 무언가를 실행할 수 있습니다.

cd ${parent}

tar cvf Tar_File.`date%Y%M%D_%H%M%S` ${source}

if [ $? != 0 ]

then

 echo "Backup FAILED for ${source} at `date` >> ${logFile}

else

 echo "Backup SUCCESS for ${source} at `date` >> ${logFile}

 rm -rf ${source}

fi

1

이것은 아마도 버그 일 것입니다.

이 경우 "file"이라는 단어도 모호합니다. 그러나 이것은 커맨드 라인 스위치이기 때문에 디렉토리도 의미합니다. 유닉스 / lnux에서는 모든 것이 파일이며 디렉토리이기 때문입니다. (다른 해석도 물론 유효하지만 그러한 경우 디렉토리를 유지하는 것은 의미가 없습니다. 예상치 못한 혼란스러운 행동으로 간주합니다.)

그러나 일부 배포판의 gnu tar에서 gnu tar는 실제로 디렉토리 트리를 제거한다는 것을 알았습니다. 트리를 유지하는 것이 버그라는 또 다른 표시. 또는 그들이 고칠 때까지 적어도 일부 해결 방법.

이것은 우분투 10.04 콘솔에서 시도한 것입니다.

mit : / var / tmp $ mkdir tree1                                                                                               
mit : / var / tmp $ mkdir tree1 / sub1                                                                                          
mit : / var / tmp $> tree1 / sub1 / file1                                                                                        

mit : / var / tmp $ ls -la                                                                                                    
drwxrwxrwt 4 루트 루트 4096 2011-11-14 15:40.                                                                              
drwxr-xr-x 16 루트 루트 4096 2011-02-25 03:15 ..
drwxr-xr-x 3 mit mit 4096 2011-11-14 15:40 트리 1

mit : / var / tmp $ tar -czf tree1.tar.gz tree1 / --remove-files

# 당신은 지금 나무가 사라지는 것을 볼 수 있습니다 :

mit : / var / tmp $ ls -la
drwxrwxrwt 3 루트 루트 4096 2011-11-14 15:41.
drwxr-xr-x 16 루트 루트 4096 2011-02-25 03:15 ..
-rw-r--r-- 1 mit mit 159 2011-11-14 15:41 tree1.tar.gz                                                                   


mit : / var / tmp $ tar --version                                                                                             
타르 (GNU 타르) 1.22                                                                                                           
저작권 © 2009 자유 소프트웨어 재단, Inc.

당신의 컴퓨터에서 그것을보고 싶다면, 이것을 당신의 책임으로 콘솔에 붙여 넣으십시오 :

tar-버전                                                                                             
cd / var / tmp
mkdir -p tree1 / sub1                                                                                          
> tree1 / sub1 / file1                                                                                        
tar -czf tree1.tar.gz tree1 / --remove-files
LS -LA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.