Wg nazwy
Możesz wygenerować listę plików w archiwum i usunąć je, ale jest to denerwująco kłopotliwe w przypadku archiwizatorów takich jak unzip lub 7z, które nie mają opcji generowania prostej listy nazw plików. Nawet w przypadku tar, zakłada się, że w nazwach plików nie ma nowych linii.
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
Zamiast usuwać pliki, możesz przenieść je do miejsca docelowego.
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
Korzystanie z BEZPIECZNIKA
Zamiast polegać na narzędziach zewnętrznych, możesz (w większości jednorożców) używać FUSE do manipulowania archiwami przy użyciu zwykłych poleceń systemu plików.
Możesz użyć Fuse-zip, aby zajrzeć do pliku zip, wyodrębnić go cp
, wyświetlić listę jego zawartości za pomocą find
itp.
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
System AVFS tworzy widok całej hierarchii katalogów, w której wszystkie archiwa mają powiązany katalog (ta sama nazwa z # tacked na końcu), który wydaje się zawierać zawartość archiwum.
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
Według daty
Zakładając, że nie było żadnej innej aktywności w tej samej hierarchii niż ekstrakcja, możesz wyodrębnić pliki według ich ostatniej godziny . Jeśli właśnie utworzyłeś lub przeniosłeś plik zip, możesz użyć go jako odcięcia; w przeciwnym razie użyj, ls -lctr
aby ustalić odpowiedni czas odcięcia. Jeśli chcesz mieć pewność, że nie usuniesz zamków, nie ma powodu, aby dokonywać ręcznego zatwierdzania: find
jest w stanie całkowicie je wykluczyć. Oto przykładowe polecenia używające zsh lub find
; zauważ, że -cmin
i podstawowe -cnewer
nie są w POSIX, ale istnieją w Linux (i innych systemach z GNU find), * BSD i 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
W GNU find, FreeBSD i OSX, innym sposobem na określenie czasu odcięcia jest utworzenie pliku i użycie go touch
do ustawienia czasu mtime na czas odcięcia.
touch -d … cutoff
find . -type f -newercm cutoff -delete
Zamiast usuwać pliki, możesz przenieść je do miejsca docelowego. Oto sposób wyszukiwania GNU / * BSD / OSX, tworząc katalogi w miejscu docelowym w razie potrzeby.
find . \! -name . -cmin -5 -type f -exec sh -c '
for x; do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' /intended/destination {} +
Odpowiednik Zsh (prawie: ten odtwarza całą hierarchię katalogów, nie tylko katalogi, które będą zawierać pliki):
autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'
Ostrzeżenie, nie testowałem większości poleceń w tej odpowiedzi. Zawsze sprawdzaj listę plików przed usunięciem ( echo
najpierw uruchom , a następnie, rm
jeśli jest w porządku).