tar 파일 추출 엉망 실행 취소 이제 약

방금 깔끔한 디렉토리에 파일을 엉망으로 만드는 아카이브를 압축 해제했습니다. 예를 들면 다음과 같습니다.

user@comp:~/tidy$ tar xvf myarchive.tar
file1
file2
dir1/
dir1/file1
dir1/subdir1/
dir1/subdir1/file1
dir2/
dir2/file1
...

tar 파일이 단일 폴더 (예 :)로 구성 될 것으로 예상 myarchive/했지만 그렇지 않았습니다! 이제 약 190 개의 파일과 디렉토리가 구성되어있는 디렉토리에 디지털로 바프되었습니다. 이 untar 파일은 정리해야합니다.

이것을 “취소”하고이 아카이브에서 추출한 파일과 디렉토리를 삭제하는 방법이 있습니까?


아래의 훌륭한 답변에 감사드립니다. 요약 하면 다음은 두 단계 (1) 파일 삭제 및 (2) 빈 디렉토리 구조를 역 패킹 순서로 삭제하는 것입니다 (외부 디렉토리를 먼저 삭제).

tar tf myarchive.tar | xargs -d'\n' rm
tar tf myarchive.tar | tac | xargs -d'\n' rmdir

그리고 echo이후 에 추가하여 명령의 드라 이런을 미리 보는 것이 더 안전합니다 xargs.



답변

tar tf archive.tar

내용을 한 줄씩 나열합니다.

이것은 xargs직접 파이프 될 수 있지만 주의하십시오 : 삭제를 매우 신중하게 수행하십시오. 당신은 하지 않습니다 단지 원하는 rm -r모든 tar tf것이 풀기 전에 비우되지 않은 디렉토리를 포함 할 수 있기 때문에, 당신을 알려줍니다!

넌 할 수있어

tar tf archive.tar | xargs -d'\n' rm -v
tar tf archive.tar | sort -r | xargs -d'\n' rmdir -v

먼저 아카이브에 있던 모든 파일을 제거한 다음 비어있는 디렉토리를 제거하십시오.

sort -r가장 깊은 디렉토리를 먼저 삭제하려면 glennjackman 이 수락 된 답변에 대한 의견 tac대신 제안 되었습니다 sort -r. 이는 tar출력이 충분하기 때문에 작동합니다 . 그렇지 않으면 dir1빈 디렉토리 dir2가 하나 포함 된 케이스 는 제거 되기 전에 비어 있지 않기 때문에 통과 dir1후에 남겨 집니다.rmdirdir2

이것은 많은 것을 생성합니다

rm: cannot remove `dir/': Is a directory

rmdir: failed to remove `dir/': Directory not empty
rmdir: failed to remove `file': Not a directory

성가신 경우이 기능을 종료하십시오 2>/dev/null. 그러나 프로세스에 대한 정보를 최대한 많이 유지하고 싶습니다.

올바른 파일과 일치 할 때까지 수행하지 마십시오. 그리고 아마도 rm -i모든 것을 확인 하려고 노력하십시오 . 백업을하고 아침 식사를하고 양치질을하십시오.


답변

tar 파일의 내용을 다음과 같이 나열하십시오.

tar tzf myarchive.tar

그런 다음 해당 목록을 반복하여 해당 파일 이름을 삭제하십시오.

while IFS= read -r file; do echo "$file"; done < <(tar tzf myarchive.tar.gz)

이것은 여전히 삭제 될 파일을 나열 합니다. 교체 echorm당신이 정말로 확실이 제거하려는 사람들이다 있다면. 그리고 확실하게 백업을 만들 수도 있습니다.

두 번째 단계에서 남아있는 디렉토리를 제거하십시오.

while IFS= read -r file; do rmdir "$file"; done < <(tar tzf myarchive.tar.gz)

이렇게하면 디렉토리가 이미 존재하는 경우 디렉토리가 삭제되지 않습니다.


@glennjackman의 또 다른 멋진 트릭은 가장 깊은 파일부터 시작하여 파일 순서를 유지합니다. echo완료되면 다시 제거하십시오 .

tar tvf myarchive.tar | tac | xargs -d'\n' echo rm

그런 다음 정상적인 rmdir정리 가 이어질 수 있습니다 .


답변

추출 된 파일을 가져 와서 서브 디렉토리로 이동하여 기본 폴더를 정리할 가능성이 있습니다.

    #!/usr/bin/perl -w

    use strict;
    use Getopt::Long;

    my $clean_folder = "clean";
    my $DRY_RUN;
    die "Usage: $0 [--dry] [--clean=dir-name]\n"
        if ( !GetOptions("dry!" => \$DRY_RUN,
                         "clean=s" => \$clean_folder));

    # Protect the 'clean_folder' string from shell substitution
    $clean_folder =~ s/'/'\\''/g;

    # Process the "tar tv" listing and output a shell script.
    print "#!/bin/sh\n" if ( !$DRY_RUN );
    while (<>)
    {
        chomp;

        # Strip out permissions string and the directory entry from the 'tar' list
        my $perms = substr($_, 0, 10);
        my $dirent = substr($_, 48);

        # Drop entries that are in subdirectories
        next if ( $dirent =~ m:/.: );

        # If we're in "dry run" mode, just list the permissions and the directory
        # entries.
        #
        if ( $DRY_RUN )
        {
            print "$perms|$dirent\n";
            next;
        }

        # Emit the shell code to clean up the folder
        $dirent =~ s/'/'\\''/g;
        print "mv -i '$dirent' '$clean_folder'/.\n";
    }

이것을 파일에 저장하십시오 fix-tar.pl 하고 다음과 같이 실행하십시오.

$ tar tvf myarchive.tar | perl fix-tar.pl --dry

tar목록이 내 것과 같다는 것을 확인합니다 . 다음과 같은 출력이 표시되어야합니다.

-rw-rw-r--|batch
-rw-rw-r--|book-report.png
-rwx------|CaseReports.png
-rw-rw-r--|caseTree.png
-rw-rw-r--|tree.png
drwxrwxr-x|sample/

그것이 좋아 보인다면 다음과 같이 다시 실행하십시오.

$ mkdir cleanup
$ tar tvf myarchive.tar | perl fix-tar.pl --clean=cleanup > fixup.sh

fixup.sh스크립트는 최상위 파일과 디렉토리를 “깨끗한”폴더 (이 경우 폴더)로 이동시키는 쉘 명령입니다 cleanup. 이 스크립트를 들여다보고 모든 것이 정결하다는 것을 확인하십시오. 그렇다면 다음과 같이 엉망을 정리할 수 있습니다.

$ sh fixup.sh

나는 이런 종류의 정리를 선호한다 tar xv.

참고 : 초기 드라이 런 출력이 올바르게 보이지 않으면 두 숫자를 사용하여 바이올린을 칠 수 있습니다. substr 함수 호출 적절 해 보일 때까지 . $perms변수는 그래서 정말에만 실행 건조에 사용되는 $dirent하위 문자열 요구에 적절한 될 수 있습니다.

또 다른 사항 : 목록 의 사용자 이름 및 / 또는 그룹 이름으로 인해 이름이 예측할 수없는 열로 시작하는 경우이 tar옵션 을 사용해야 할 수도 있습니다 .--numeric-ownertar


답변

이런 종류의 (반사회적) 아카이브는 그것이하는 일 때문에 타르 폭탄이라고합니다. 이 중 하나가 “폭발”되면 다른 답변의 솔루션이 내가 제안한 것보다 훨씬 낫습니다.

그러나 가장 좋은 “해결책”은 처음에 문제를 방지하는 것입니다.

가장 쉬운 방법은 항상 tar 아카이브를 빈 디렉토리에 압축 해제하는 것입니다. 최상위 디렉터리가 포함되어 있으면 원하는 대상으로 이동하면됩니다. 그렇지 않은 경우 작업 디렉토리 (비어 있던 디렉토리)의 이름을 바꾸고 원하는 위치로 옮기십시오.

처음으로 올바르게 가져 오려면 tar -tvf archive-file.tar | less는 아카이브의 내용을 나열하므로 아카이브 구조를 확인한 다음 원하는 위치로 추출하는 데 필요한 작업을 수행 할 수 있습니다.

t 옵션은 아카이브의 내용을 검사하여 원하는 내용이 있는지 확인하려는 경우에도 유용합니다. 그렇다면 선택적으로 원하는 파일을 추출 할 수 있습니다.


답변