โดยชื่อ
คุณสามารถสร้างรายชื่อไฟล์ในไฟล์เก็บถาวรและลบไฟล์ได้แม้ว่าจะเป็นไฟล์ที่มีปัญหากับไฟล์เก็บถาวรเช่น 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เพื่อมองเข้าไปในซิปแยกมัน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สร้างมุมมองของลำดับชั้นไดเรกทอรีทั้งหมดของคุณที่เก็บถาวรทั้งหมดมีไดเรกทอรีที่เกี่ยวข้อง (ชื่อเดียวกันกับ # tacked ในตอนท้าย) ที่ปรากฏขึ้นเพื่อเก็บเนื้อหาที่เก็บถาวร
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
ถ้าตกลง)