Archive

如何在雜亂的文件夾中解壓縮、解壓縮 -xvf – 解壓縮?

  • November 16, 2021

通常,我會取消存檔,$ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zip但有時我會變得懶惰,只是在任意文件夾中進行操作,$ unzip *.zip因此不時會弄亂其他內容。我將在這裡列出一些方法——一些存檔版本肯定有蹩腳的標誌,而另一些則更簡陋,我對後者更感興趣。

一些取消歸檔的方法,還有其他方法嗎?

  1. $ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' \;缺點是它列出了*.zip目錄,因此您需要使用 slow -ok, slow 與許多*.zip匹配項,並且由於某種原因,它似乎與提取的所有內容都不匹配。
  2. 如果提取的文件量很少,一個接一個,速度慢,麻煩且容易出錯。
  3. 當我想確定檔案的內容是否真的是一個文件夾時,我有時會檢查它$ 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如果可以)。

引用自:https://unix.stackexchange.com/questions/5123