방금 깔끔한 디렉토리에 파일을 엉망으로 만드는 아카이브를 압축 해제했습니다. 예를 들면 다음과 같습니다.
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
후에 남겨 집니다.rmdir
dir2
이것은 많은 것을 생성합니다
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)
이것은 여전히 삭제 될 파일을 나열 합니다. 교체 echo
로 rm
당신이 정말로 확실이 제거하려는 사람들이다 있다면. 그리고 확실하게 백업을 만들 수도 있습니다.
두 번째 단계에서 남아있는 디렉토리를 제거하십시오.
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-owner
tar
답변
이런 종류의 (반사회적) 아카이브는 그것이하는 일 때문에 타르 폭탄이라고합니다. 이 중 하나가 “폭발”되면 다른 답변의 솔루션이 내가 제안한 것보다 훨씬 낫습니다.
그러나 가장 좋은 “해결책”은 처음에 문제를 방지하는 것입니다.
가장 쉬운 방법은 항상 tar 아카이브를 빈 디렉토리에 압축 해제하는 것입니다. 최상위 디렉터리가 포함되어 있으면 원하는 대상으로 이동하면됩니다. 그렇지 않은 경우 작업 디렉토리 (비어 있던 디렉토리)의 이름을 바꾸고 원하는 위치로 옮기십시오.
처음으로 올바르게 가져 오려면 tar -tvf archive-file.tar | less는 아카이브의 내용을 나열하므로 아카이브 구조를 확인한 다음 원하는 위치로 추출하는 데 필요한 작업을 수행 할 수 있습니다.
t 옵션은 아카이브의 내용을 검사하여 원하는 내용이 있는지 확인하려는 경우에도 유용합니다. 그렇다면 선택적으로 원하는 파일을 추출 할 수 있습니다.