让我们有一个包含许多单独.txt
文件的目录。我的目的是找到目录中的各个文件,用相同的名称(不包括.txt)单独压缩它们并删除原始文件。
使用起来非常简单,gzip
如下所示:
find .* -type f | xargs gzip
但我需要压缩文件。
注意:我没有 sudo 权限
答案1
考虑:
$ ls -1
a.txt
b.txt
c.txt
d.jpg
以下命令将压缩每个.txt
文件并删除原始文件:
find . -maxdepth 1 -type f -name '*.txt' -exec zip -Tm {}.zip {} \;
结果:
$ ls -1
a.txt.zip
b.txt.zip
c.txt.zip
d.jpg
笔记:在删除输入文件之前,我们使用该-T
选项来测试存档的完整性。选项zip
的手册页中建议这样做-m
:
-m, --move
将指定文件移动到zip存档中;实际上,这会在创建指定的 zip 存档后删除目标目录/文件。如果删除文件后目录变空,则该目录也会被删除。在 zip 无错误地创建存档之前,不会进行任何删除操作。这对于节省磁盘空间很有用,但存在潜在危险,因此建议-T
在删除所有输入文件之前将其与测试存档结合使用。
请注意,该.txt
部分仍然存在于文件名中。这gzip
也是行为方式。
要移除该.txt
部件:
如果您不希望该.txt
部分保留在文件名中,可以使用以下命令来实现:
find . -maxdepth 1 -name '*.txt' -type f -exec bash -c \
'zip -Tm "${1%.*}".zip "$1"' inline-bash {} \;
结果:
$ ls -1
a.zip
b.zip
c.zip
d.jpg
笔记:find
上面命令调用的谓词顺序避免了对名称与模式不匹配的那些文件应用-type f
(这可能涉及昂贵的系统调用) 。 (lstat()
*.txt
参考)
笔记:我们提供了inline-bash
作为内联脚本的第一个参数。这样做有两个好处:
$0
在我们的内联脚本中将被设置为inline-bash
. (回想起那个“$0 扩展为 shell 或 shell 脚本的名称” —bash手册-c
.) 对于用 、 using或类似的方式执行的内联脚本inline-bash
,对于此目的来说是合乎逻辑的,并且比我们选择另一种流行的选择 时会产生更有意义的错误消息_
。- 我们脚本的位置参数将像往常一样从 1 开始。
为内联脚本提供第 0 个参数以及如何称呼它,在文章关于使用查找(mywiki.wooledge.org)并在斯特凡·查泽拉斯 (Stéphane Chazelas) 的回答对这个问题可以find -exec sh -c
安全使用吗?。
答案2
来自男人:
-m --move Move the specified files into the zip archive; actually, this deletes the target directories/files after making the specified zip archive. If a directory becomes empty after removal of the files, the directory is also removed. No deletions are done until zip has created the archive without error. This is use- ful for conserving disk space, but is potentially dangerous so it is recommended to use it in combination with -T to test the archive before removing all input files.
压缩当前目录中的 Ann 文件
zip -m test.zip *.txt
尝试这,
for i in *.txt;
do
zip -m "${i%.*}.zip" "${i%.*}".*;
done
上面的代码将在 for 循环中获取所有以 .txt 作为扩展名的文件,并使用其前缀名称压缩每个文件...