有时我会执行如下命令
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/dir
。ls -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
改成。echo
rm
它正在做什么(在反引号内):
- 列出文件(逐个)
- 挤压空间
- 选择第 5 个字段
- 删除文件夹名称中的所有内容
答案4
假设您当前的工作目录是您意外提取文件的文件夹:
unzip -Z1 ../../accidentally-extracted.zip | xargs rm
解释:
unzip -Z1
逐行列出 zip 文件中的所有文件xargs
将每一行作为参数传递给rm
如果您不在意外解压到的文件夹中,则可能会无意中删除与 zip 中的一个文件匹配的文件。
如果你不确定,你可以运行xargs
它,-p
让它在每次执行时提示你。你可以先执行几次,以确保你没有搞砸任何事情。