在保留文件结构的同时单独压缩和加密多个文件

时间:2014-11-16 17:45:39

标签: encryption compression backup

我有几个看起来像这样的目录:

dir1/
  |_foo.txt
  |_bar.txt
dir2/
  |_qux.txt
  |_bar.txt

对于每个目录,我想将其中的文件压缩为某种加密格式 然后将结构复制到新位置(在线某处)。所以最后我们希望在新的位置得到这样的东西:

 dir1/
   |_foo.rar
   |_bar.rar
 dir2/
   |_qux.rar
   |_bar.rar

有简单的Unix方法吗?

P.S。我正在寻找加密和压缩文件的rar,但如果有更好的信息让我知道。

编辑:如果我不清楚,这是为了备份目的。

1 个答案:

答案 0 :(得分:1)

我会这样做。

首先,创建此帮助程序脚本并将其放在某处。我把我放在/Users/martin/1temp/stackoverflow/26960080/encrypt-and-compress.sh。不要忘记使用chmod + x使其可执行,并且不要忘记更新路径以使它们与您的系统匹配。请注意文件temp-password-for-batch-encryption.txt,它是一个简单的文本文件,其中一行包含用于加密的密码。如果没有此文件,您必须手动输入加密的每个文件的密码,这很快就会变成一个漏洞。请注意谁有权阅读该文件。

#!/bin/bash

# The relative path of the file to encrypt, passed as a parameter by find
file_to_encrypt="$1"

# The directory where the mirrored, encrypted directory structure shall end up
dest_dir="$HOME/1temp/stackoverflow/26960080/result-dir"

# Relative path to the dir of the file to encrypt, used to create the
# same directory structure elsewhere
dir_of_file_to_encrypt="$(dirname ${file_to_encrypt})"

# In what dir to put the result file, used to be able to create that
# dir before we encrypt the file
dest_dir_of_file_to_encrypt="${dest_dir}/${dir_of_file_to_encrypt}"

# Path to where the encrypted file shall be put
dest_file="${dest_dir}/${file_to_encrypt}"

# To not have to input the password manually each time, put it in this
# file temporarily (make sure to now allow anywone else to access this
# file...)
password_file="$HOME/1temp/stackoverflow/26960080/temp-password-for-batch-encryption.txt"

# Make sure the dest dir exists
mkdir -p "${dest_dir_of_file_to_encrypt}"

echo "About to encrypt ${file_to_encrypt} and putting it in ${dest_file} using password in ${password_file}"
# Encrypt the file and put it in the dest dir
# --symetric: Use simple so called symmetric encryption
# --cipher-algo: Select encryption algorithm
# --passphrase-fd 0: make "password from a file" work
# --yes: Overwrite any existing files
cat "${password_file}" | gpg --symmetric --cipher-algo AES256 --passphrase-fd 0 --yes --output "${dest_file}" "${file_to_encrypt}"

然后,cd进入要加密的目录结构的根目录。

cd /Users/martin/1temp/stackoverflow/26960080/input-dir/

然后使用find运行每个文件的脚本,如下所示:

find . -type f -exec /Users/martin/1temp/stackoverflow/26960080/encrypt-and-compress.sh {} \;

这会将input-dir树镜像到result-dir。要解密文件,请使用:

gpg --decrypt /Users/martin/1temp/stackoverflow/26960080/result-dir/./dir1/foo.txt

要镜像生成的加密目录结构,我建议您使用rsync。详细信息很大程度上取决于您拥有/想要的设置,但谷歌很容易。

祝你好运!