名前で
アーカイブ内のファイルのリストを生成して削除できますが、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を使用して、通常のファイルシステムコマンドを使用してアーカイブを操作できます。
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
primariesは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を使用して、必要に応じて宛先にディレクトリを作成する方法を示します。
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
なければ)。