我有一个包含只写文件的文件夹,并且想在压缩时排除它们。
我不想看到与这些只写文件相关的任何警告或错误。
请让我知道执行此操作的最佳方法?
例子:
sh:~/t12$ ls -l
total 0
--w--w--w- 1 som som 0 Dec 5 05:59 a
-rw-rw-r-- 1 som som 0 Dec 5 05:59 b
-rw-rw-r-- 1 som som 0 Dec 5 05:59 c
sh:~/t12$ zip -r zipFileName /home/som/t12/*
adding: home/som/t12/a
zip warning: Permission denied
zip warning: could not open for reading: home/som/t12/a
adding: home/som/t12/b (stored 0%)
adding: home/som/t12/c (stored 0%)
zip warning: Not all files were readable
files/entries read: 2 (0 bytes) skipped: 1 (0 bytes)
答案1
我会尝试类似的事情:
find . -readable -type f -exec zip -q zipFileName {} +
命令:
find . -readable -type f
返回具有读取权限的所有文件.
。
第二部分
-exec zip -q zipFileName {} +
执行zip
提供找到的文件名的命令。
答案2
zip
您可以通过提供可以读取的扩展文件列表来避免警告。
在 zsh 中,这将是:
zip -r zipFileName /home/som/t12/**/*(.r)
无需更改为 zsh 作为 shell,您可以调用:
zsh -c 'zip -r zipFileName /home/som/t12/**/*(.r)'
之后的通配符模式/home/som/t12/
是:
**/*
-- 启用递归,以便每个文件和目录都展开到列表中(.r)
-- 一个 glob 限定符,将扩展列表限制为纯文件(带有.
),并且 -- 对于这个问题至关重要 -- 当前用户可读的文件(带有r
)。
最终的结果是zip
命令行是:
zip -r zipFileName home/som/t12/b home/som/t12/c ...
......
该目录下您可以读取的(普通)文件列表在哪里。
这里的一个副作用是通配符扩展不显式匹配目录,因此虽然您之前的解决zip -r zipFileName /home/som/t12/
方案会在 zip 文件中包含目录条目,但上述解决方案不会。这些子目录中的文件仍将以其完整路径显示在 zip 文件中。
如果您碰巧提前知道只写文件名,您可以使用以下命令zip
排除它们:
zip -r zipFileName /home/som/t12/ -x /home/som/t12/a -x /home/som/t12/any/other/files ...
...其中-x
标志告诉zip
要排除哪些文件;确保将它们的路径与您为 zip 提供的路径相匹配。
答案3
一种方法是生成要使用 压缩的文件列表find
,然后zip
使用-@
选项将它们传递给。
例如,考虑这样的布局:
$ ls -l . test2/
.:
total 0
--w--w--w- 1 testuser testuser 0 Dec 5 21:26 a
-rw-rw-r-- 1 testuser testuser 0 Dec 5 21:26 b
-rw-rw-r-- 1 testuser testuser 0 Dec 5 21:26 c
drwxr-xr-x+ 1 testuser testuser 0 Dec 5 21:31 test2
test2/:
total 0
--w--w--w- 1 testuser testuser 0 Dec 5 21:31 a
-rw-rw-r-- 1 testuser testuser 0 Dec 5 21:26 b
-rw-rw-r-- 1 testuser testuser 0 Dec 5 21:26 c
然后可以使用该find
命令排除只写权限类型(八进制形式的 222)的文件。
$ find . -type f ! -perm 222
./b
./c
./test2/b
./test2/c
将这些文件传递到以zip
将它们压缩到存档中:
$ find . -type f ! -perm 222 | zip myfile.zip -@
adding: b (stored 0%)
adding: c (stored 0%)
adding: test2/b (stored 0%)
adding: test2/c (stored 0%)
并验证您的存档:
$ unzip -l myfile.zip
Archive: myfile.zip
Length Date Time Name
--------- ---------- ----- ----
0 12-05-2019 21:26 b
0 12-05-2019 21:26 c
0 12-05-2019 21:26 test2/b
0 12-05-2019 21:26 test2/c
--------- -------
0 4 files
请记住find
,如果您的文件名包含嵌入的换行符,该命令可能会在此处中断。空格不是问题,因为-@
选项将每一行输出解析为一个文件。