İsimle
Arşivdeki dosyaların listesini oluşturabilir ve silebilirsiniz, ancak bu, unzip veya 7z gibi düz bir dosya adları listesi oluşturma seçeneği olmayan arşivlerle rahatsız edici bir şekilde hareket eder. Katranla bile, bu dosya adlarında yeni satır bulunmadığını varsayar.
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
Dosyaları kaldırmak yerine, hedeflenen hedeflerine taşıyabilirsiniz.
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 ürününü kullanma
Harici araçlara bağlı kalmak yerine, (çoğu unice üzerinde) FUSE ürününü , normal dosya sistemi komutlarını kullanarak arşivleri işlemek için kullanabilirsiniz .
Bir zip içine bakmak, çıkartmak , içeriğini listelemek vb. İçin Fuse-zip kullanabilirsiniz .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 , tüm arşiv hiyerarşinizin tüm arşivinin, içerik içeriğini tuttuğu görünen ilişkili bir dizine (sonunda # tacked ile aynı ad) sahip olduğu bir görünüm oluşturur.
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
Tarihe göre
Senin çıkarma ile aynı hiyerarşi içinde herhangi etkinlik diğer olmamıştır varsayarsak, onların son tarafından çıkartılan dosyaları söyleyebilir ctime . Zip dosyasını yeni oluşturduysanız veya taşıdıysanız, bir kesme olarak kullanabilirsiniz; aksi takdirde ls -lctr
uygun bir kesme süresi belirlemek için kullanın . Fermuarları çıkarmamaya dikkat etmek istiyorsanız, herhangi bir manuel onay yapmak için hiçbir neden yoktur: find
bunları hariç tutabilme özelliği mükemmeldir. Burada zsh veya find
; o notu -cmin
ve -cnewer
ön seçimler POSIX'deki değil ama Linux (ve GNU Bul ile diğer sistemlerde) mevcut, * BSD ve 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 ve OSX ile, kesme zamanını belirtmenin başka bir yolu bir dosya oluşturmak touch
ve mtime'ı kesme zamanına ayarlamak için kullanmaktır .
touch -d … cutoff
find . -type f -newercm cutoff -delete
Dosyaları kaldırmak yerine, hedeflenen hedeflerine taşıyabilirsiniz. İşte GNU / * BSD / OSX find ile hedefe gerektiği gibi dizinler oluşturarak bir yol.
find . \! -name . -cmin -5 -type f -exec sh -c '
for x; do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' /intended/destination {} +
Zsh eşdeğeri (neredeyse: bu, yalnızca dosya içerecek dizinleri değil, tüm dizin hiyerarşisini üretir):
autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'
Uyarı, bu cevaptaki komutların çoğunu test etmedim. Kaldırmadan önce her zaman dosya listesini gözden geçirin (önce çalıştır echo
, sonra sorun rm
yoksa).