Bằng tên
Bạn có thể tạo danh sách các tệp trong kho lưu trữ và xóa chúng, mặc dù điều này gây khó chịu với các trình lưu trữ như giải nén hoặc 7z không có tùy chọn để tạo danh sách tên tệp đơn giản. Ngay cả với tar, điều này giả định không có dòng mới trong tên tệp.
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
Thay vì xóa các tệp, bạn có thể di chuyển chúng đến đích dự định của chúng.
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
Sử dụng cầu chì
Thay vì phụ thuộc vào các công cụ bên ngoài, bạn có thể (trên hầu hết các thông báo) sử dụng FUSE để thao tác lưu trữ bằng các lệnh hệ thống tập tin thông thường.
Bạn có thể sử dụng Fuse-zip để nhìn trộm vào zip, giải nén nó cp
, liệt kê nội dung của nó với find
, v.v.
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 tạo chế độ xem toàn bộ hệ thống phân cấp thư mục của bạn trong đó tất cả các tài liệu lưu trữ có một thư mục được liên kết (cùng tên với # được xử lý ở cuối) xuất hiện để giữ nội dung lưu trữ.
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
Theo ngày
Giả sử đó vẫn chưa được bất kỳ hoạt động khác trong hệ thống phân cấp cùng hơn khai thác, bạn có thể nói với các tập tin được trích xuất bởi gần đây của họ ctime . Nếu bạn vừa tạo hoặc di chuyển tệp zip, bạn có thể sử dụng nó làm điểm cắt; mặt khác sử dụng ls -lctr
để xác định thời gian cắt phù hợp. Nếu bạn muốn đảm bảo không xóa các khóa, không có lý do gì để thực hiện bất kỳ phê duyệt thủ công nào: find
hoàn toàn có khả năng loại trừ chúng. Dưới đây là các lệnh ví dụ sử dụng zsh hoặc find
; lưu ý rằng -cmin
và -cnewer
các nguyên tắc không có trong POSIX mà tồn tại trên Linux (và các hệ thống khác có GNU find), * BSD và 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
Với GNU find, FreeBSD và OSX, một cách khác để chỉ định thời gian cắt là tạo một tệp và sử dụng touch
để đặt mtime của nó thành thời gian cắt.
touch -d … cutoff
find . -type f -newercm cutoff -delete
Thay vì xóa các tệp, bạn có thể di chuyển chúng đến đích dự định của chúng. Đây là một cách với GNU / * BSD / OSX find, tạo các thư mục ở đích khi cần.
find . \! -name . -cmin -5 -type f -exec sh -c '
for x; do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' /intended/destination {} +
Tương đương Zsh (gần như: cái này tái tạo toàn bộ hệ thống phân cấp thư mục, không chỉ các thư mục sẽ chứa các tệp):
autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'
Cảnh báo, tôi đã không kiểm tra hầu hết các lệnh trong câu trả lời này. Luôn xem lại danh sách các tập tin trước khi gỡ bỏ (chạy echo
trước, sau đó rm
nếu nó ổn).