我有以下脚本来批量加密文件:
#!/bin/bash
find "/some/dir" -type f -exec bash -c "gpg -e -r [email protected] '{}' && rm '{}'" \;
该脚本工作正常,除非文件名包含撇号。然后 gpg 打印一个关于不正确语法的错误。如何处理这些文件?
答案1
我认为这也可以在不调用 shell 的情况下完成:
find "/some/dir" -type f -exec gpg -e -r [email protected] {} \; -exec rm {} \;
或者
find "/some/dir" -type f -exec gpg -e -r [email protected] {} \; -delete
这应该有效,因为-exec ... \;
也充当条件,所以如果gpg
失败,以下-exec
或-delete
将不会运行。
答案2
不要将{}
文件名嵌入到 shell 代码中间,而是将其作为参数传递给 shell。
像这样:
find "/some/dir" -type f -exec bash -c '
gpg -e -r [email protected] "$1" && echo rm "$1"
' bash {} \;
echo
当输出令人满意时删除语句。
恕我直言,这是一个非常有趣的概念,不仅对于这种特殊情况,这是工具箱中的一个技巧;)