按名字
您可以生成存档中的文件列表并删除它们,尽管对于诸如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
确定合适的截止时间。如果要确保不删除这些zip,则无需进行任何手动批准:find
完全可以排除它们。这是使用zsh或find
;的示例命令。请注意,-cmin
和主目录-cnewer
不在POSIX中,而是存在于Linux(和其他具有GNU find的系统),* 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 . \! -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
)。