使用此命令,我们可以递归地解压缩目录及其子目录中的档案,并在当前工作目录中保留其结构。
find ../backUp/ -name "*.zip" |
xargs -P 5 -I fileName sh -c '
unzip -o -d "$(dirname "fileName")/$(basename -s .zip "fileName")" "fileName"
'
但是当我运行它时,所有解压的文件夹都保留在原始目录中。我们可以在 bash 环境中硬编码 basename 和 dirname 吗?
添加示例:
/backUp/pic1/1.zip
/backUp/pic2/2.zip
/backUp/pic3/3.zip
Goal:
/new/pic1/1-1.png
/new/pic1/1-2.png
/new/pic2/2-1.png
/new/pic2/2-2.png
/new/pic3/3-1.png
答案1
您需要使用 find 的-execdir
选项。这将cd
依次到达包含匹配文件(“*.zip”)的每个目录并执行您指定的命令,将该特定目录中的匹配文件名作为参数传递给命令。
例如:
find . -name '*.zip' -execdir sh -c 'for f; do unzip -o "$f"; done' find-sh {} +
注意:由于我们使用sh -c
as 命令,因此我们需要向其传递一个虚拟参数作为第一个(第零个)参数。这将是内核进程表中进程的名称(在这里,我使用它find-sh
作为名称)。其余参数{}
是文件名。这些可以在sh -c
脚本中以通常的方式访问,如$1
、$2
、$3
、$@
、$*
等...在这个例子中,我用 迭代它们for f; do ... ; done
,这是 的简写for f in "$@"; do ... ; done
顺便说一句,如果你想看看它是如何工作的,你可以使用echo
而不是解压缩。例如,以下命令将打印至少包含一个 .zip 文件的每个目录的名称,后跟一个冒号以及该目录中的 .zip 文件列表。每个目录输出一行。
find . -name "*.zip" -execdir sh -c 'echo "$PWD:" "$@"' find-sh {} +