如何在雜亂的文件夾中解壓縮、解壓縮 -xvf – 解壓縮?
通常,我會取消存檔,
$ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip
但有時我會變得懶惰,只是在任意文件夾中進行操作,$ unzip *.zip
因此不時會弄亂其他內容。我將在這裡列出一些方法——一些存檔版本肯定有蹩腳的標誌,而另一些則更簡陋,我對後者更感興趣。一些取消歸檔的方法,還有其他方法嗎?
$ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' \;
缺點是它列出了*.zip
目錄,因此您需要使用 slow-ok
, slow 與許多*.zip
匹配項,並且由於某種原因,它似乎與提取的所有內容都不匹配。- 如果提取的文件量很少,一個接一個,速度慢,麻煩且容易出錯。
- 當我想確定檔案的內容是否真的是一個文件夾時,我有時會檢查它
$ unzip -l *.bsd
,至少在 obsd 的解壓縮版本中有效。如果您指的是某些歸檔工具,請在適當的時候說明它們。不過保持簡單——我對你如何做的方式更感興趣,而不是單一的工具。
按名字
您可以在存檔中生成文件列表並刪除它們,儘管這對於 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
使用保險絲
您可以(在大多數 unice 上)使用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
確定合適的截止時間。如果您想確保不移除拉鍊,則沒有理由進行任何手動批准: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
如果可以)。