Zip -r 并希望排除/忽略没有读取权限的文件

Zip -r 并希望排除/忽略没有读取权限的文件

我有一个包含只写文件的文件夹,并且想在压缩时排除它们。

我不想看到与这些只写文件相关的任何警告或错误。

请让我知道执行此操作的最佳方法?

例子:

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,如果您的文件名包含嵌入的换行符,该命令可能会在此处中断。空格不是问题,因为-@选项将每一行输出解析为一个文件。

相关内容