이름으로
압축 파일에서 파일 목록을 생성하고 삭제할 수는 있지만 unzip 또는 7z와 같은 평범한 파일 이름 목록을 생성 할 수있는 옵션이없는 아카이브에서는 성가신 일입니다. tar를 사용하더라도 파일 이름에 줄 바꿈이 없다고 가정합니다.
tar tf foo.tar | while read -r file; do rm -- "$file" done
unzip -l foo.zip | awk '
p && /^ --/ {p=2}
p==1 {print substr($0, 29)}
/^ --/ {++p}
' | while …
unzip -l foo.zip | tail -n +4 | head -n -2 | while … # GNU coreutils only
7z l -slt foo.zip | sed -n 's/^Path = //p' | while … # works on tar.*, zip, 7z and more
파일을 제거하는 대신 원하는 대상으로 이동할 수 있습니다.
tar tf foo.tar | while read -r file; do
if [ -d "$file" ]; then continue; fi
mkdir -p "/intended/destination/${file%/*}"
mv -- "$file" "/intended/destination/$file"
done
퓨즈 사용
외부 도구에 의존하는 대신, 대부분의 유니스에서 FUSE 를 사용하여 일반 파일 시스템 명령을 사용하여 아카이브를 조작 할 수 있습니다.
Fuse-zip 을 사용하여 Zip 을 들여다보고,로 추출하고 cp
, 내용을 find
등으로 나열 할 수 있습니다 .
mkdir /tmp/foo.d
fuse-zip foo.zip /tmp/foo.d
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd /tmp/foo.d && find . \! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm /tmp/foo.d/**(:"s~/tmp/foo.d/~~"^/)
## Extract the contents where you really want them
cp -Rp /tmp/foo.d /intended/destination
fusermount -u foo.d
rmdir foo.d
AVFS 는 모든 아카이브에 아카이브 컨텐츠를 보유하는 것으로 보이는 연관된 디렉토리 (끝에 #가 붙은 동일한 이름)가있는 전체 디렉토리 계층의보기를 작성합니다.
mountavfs
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd ~/.avfs/"$PWD/foo.zip#" && find . \! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm ~/.avfs/$PWD/foo.zip\#/**/*(:"s~$HOME/.avfs/$PWD/foo.zip#~~"^/)
## Extract the contents where you really want them
cp -Rp ~/.avfs/"$PWD/foo.zip#" /intended/destination
umountavfs
날짜 별
추출과 동일한 계층 구조에 다른 활동이 없다고 가정하면 추출 된 파일을 최근 ctime으로 알 수 있습니다 . zip 파일을 방금 생성하거나 이동 한 경우 컷오프로 사용할 수 있습니다. 그렇지 않으면 ls -lctr
적절한 차단 시간을 결정하는 데 사용하십시오 . 지퍼를 제거하지 않으려면 수동 승인을 수행 할 이유가 없습니다. find
완전히 제외 할 수 있습니다. 다음은 zsh 또는 find
;를 사용하는 명령 예입니다 . 주의 -cmin
와 -cnewer
예비 선거는 POSIX에 아니지만 리눅스 (와 GNU의 발견과 다른 시스템)에 존재, * BSD와 OSX.
find . \! -name '*.zip' -type f -cmin -5 -exec rm {} + # extracted <5 min ago
rm **/*~*.zip(.cm-6) # zsh, extracted ≤5 min ago
find . -type f -cnewer foo.zip -exec rm {} + # created or moved after foo.zip
GNU find, FreeBSD 및 OSX에서 컷오프 시간을 지정하는 다른 방법은 파일을 작성 touch
하고 mtime을 컷오프 시간으로 설정 하는 데 사용 하는 것입니다.
touch -d … cutoff
find . -type f -newercm cutoff -delete
파일을 제거하는 대신 원하는 대상으로 이동할 수 있습니다. 다음은 GNU / * BSD / OSX find를 사용하여 필요에 따라 대상에 디렉토리를 작성하는 방법입니다.
find . \! -name . -cmin -5 -type f -exec sh -c '
for x; do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' /intended/destination {} +
Zsh와 동등 (거의 : 파일을 포함 할 디렉토리 만이 아니라 전체 디렉토리 계층을 재생 성함) :
autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'
경고, 나는이 답변에서 대부분의 명령을 테스트하지 않았습니다. 제거하기 전에 항상 파일 목록을 검토하십시오 ( echo
먼저 실행 한 다음 rm
정상인 경우).