如何递归复制目录中的所有文件并动态解压缩压缩文件

如何递归复制目录中的所有文件并动态解压缩压缩文件

我在一个包含许多子目录的目录中收集了大量标准/压缩文件。

现在,我需要将这个结构化目录和所有内容(文件和子目录)复制到另一个磁盘中,并解压缩所有压缩文件。

因此,为了节省时间,我想递归地复制目录中的所有文件并即时解压缩压缩文件。

我怎样才能做到这一点?

答案1

我会将其分为 3 个单独的步骤,使用$SOURCE$DEST作为源目录和目标目录。

  1. 在目标目录中重新创建源目录结构

    find $SOURCE -type d | sed -e "s~^$SOURCE~~" | xargs -r -I dir mkdir -p "$DEST"/"dir"

  2. 移动所有不需要解压的文件

    find $SOURCE -type f -not -name '*.gz' | sed -e "s~^$SOURCE/~~" | xargs -r -I file cp "$SOURCE"/"file" "$DEST"/"file"

  3. 将所有压缩文件解压到目标目录

    find $SOURCE -type f -name '*.gz' | sed -e "s~^$SOURCE~~" | sed -e "s~.gz$~~" | xargs -r -I file bash -c 'gzip -dc "'"$SOURCE"'"/"file".gz > "'"$DEST"'"/"file"'

也就是说,作为建议,我建议使用rsync -av复制所有文件,然后find . -name '*.gz' -exec gunzip \{\} \;在目标目录中解压缩文件。这是一种更简单的方法,潜在的陷阱也更少。 (上述三个步骤对我来说适用于一个小型测试目录,其中文件数量有限且文件名相对简单;YMMV 适用于更复杂的用例。)

答案2

tar听起来像你想要的命令。

tar cf - <dir> | (cd <path-to-other-dir>; tar xf -)当我想将目录的内容复制到另一个文件夹时通常使用它。

相关内容