通常、私は$ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip
しかし、時々私は怠惰になり、任意のフォルダで行う$ unzip *.zip
そのため、他のコンテンツをときどき台無しにします。ここにいくつかの方法をリストします—いくつかのアーカイブバージョンは確かにくだらないフラグを持っていますが、他のバージョンはより質素です、私は後者にもっと興味があります。
アーカイブを解除する方法はいくつかありますが、他にありますか?
-
$ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' ;
弱点は、*.zip
がリストされていることです。 dirsなので、遅い-ok
を使用する必要があります 、多くの*.zip
で遅い 一致し、何らかの理由で、抽出されたすべてのものと一致しないようです。 -
抽出されたファイルが少量の場合、1つずつ、遅く、面倒で、エラーが発生しやすくなります。
-
アーカイブのコンテンツが実際にフォルダであるかどうかを確認したい場合は、
$ unzip -l *.bsd
で確認することがあります。 、少なくともobsdのunzipバージョンで機能します。
特定のアーカイブツールを参照している場合は、必要に応じてそれらを記述してください。ただし、シンプルにしてください。単一のツールではなく、その方法に関心があります。
承認された回答:
名前で
アーカイブ内のファイルのリストを生成して削除することはできますが、ファイル名のプレーンリストを生成するオプションがない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
プライマリは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
よろしければ)