意外提取位置 - 如何清理?

意外提取位置 - 如何清理?

有时我会执行如下命令

unzip tons_of_files.zip

我还忘记添加 -d 来指向子目录。这会导致当前文件夹充满大量文件,并且这些文件与现有文件混杂在一起。

删除所有这些新文件和/或将它们移动到新目录的最佳方法是什么?我想避免手动检查目录并确定文件是否是存档的一部分或已经存在。

答案1

一种快捷的方法可能是:

unzip -qql tons_of_files.zip | while read -r l d t n ; do rm -fr "$n" ; done

因为这会自动擦除:需要您自担风险使用它。要查看预览,请替换... rm ...... echo rm ...

答案2

如果你将文件解压到某个目录中,并且在解压前几分钟没有修改或移动任何文件,则你可以通过文件最近的时间。这并不完美(如果目录包含提取的文件,您无法判断它是通过解压缩创建的还是之前就存在(可能是空的))但在实践中效果相当好。

以下 GNU find 命令将当前目录中 ctime 少于 2 分钟的文件和目录移动到/other/dirls -lctr可能有助于找到合适的截止时间。

find . -mindepth 1 -maxdepth 1 -cmin -2 -exec mv {} /other/dir \;

Zsh 等效项:

mv *(cm-3) /other/directory

以下 GNU find 命令将以当前目录为根的目录树中具有相似最近 ctime 的文件移动到 下的相似路径/other/dir

find . -mindepth 1 -cmin -2 -type f -exec sh -c '
    for x; do
      mkdir -p "$0/${x%/*}"
      mv "$x" "$0/$x"
    done
  ' /other/dir {} +

Zsh 等效(几乎:这个重现了整个目录层次结构,而不仅仅是包含文件的目录):

autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/other/dir|")
zmv -Q '(**/)(*)(.cm-3)' /other/dir/'$1$2'

答案3

$ for i in `unzip -qql tons_of_files.zip | tr -s " "| cut -d" " -f 5 | sed 's/^.*///'`; do echo $i; done

改成。echorm

它正在做什么(在反引号内):

  1. 列出文件(逐个)
  2. 挤压空间
  3. 选择第 5 个字段
  4. 删除文件夹名称中的所有内容

答案4

假设您当前的工作目录是您意外提取文件的文件夹:

unzip -Z1 ../../accidentally-extracted.zip | xargs rm

解释:

  1. unzip -Z1逐行列出 zip 文件中的所有文件
  2. xargs将每一行作为参数传递给rm

如果您不在意外解压到的文件夹中,则可能会无意中删除与 zip 中的一个文件匹配的文件。

如果你不确定,你可以运行xargs它,-p让它在每次执行时提示你。你可以先执行几次,以确保你没有搞砸任何事情。

相关内容