此命令中的 dirname 和 basename 应该是什么?

此命令中的 dirname 和 basename 应该是什么?

使用此命令,我们可以递归地解压缩目录及其子目录中的档案,并在当前工作目录中保留其结构。

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 -cas 命令,因此我们需要向其传递一个虚拟参数作为第一个(第零个)参数。这将是内核进程表中进程的名称(在这里,我使用它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 {} +

相关内容