将子文件夹中的所有.bz2提取到另一个文件夹?

时间:2018-07-13 01:47:07

标签: bash shell

我的文件夹层次结构如下:

folder
-- subfolder1
---- file1.bz2
---- file2.bz2
---- file3.bz2
---- ...
-- subfolder2
---- file4.bz2
---- ...
-- subfolder3
---- file5.bz2
---- ...
-- ...

每个.bz2内都有一个.ppm文件。我想将.bz2中的所有folder提取到另一个文件夹,例如newFolder

// assume file.ppm is extracted from file.bz2
newFolder
-- file1.ppm
-- file2.ppm
-- file3.ppm
-- file4.ppm
-- file5.ppm
-- ...

或者只是1.ppm2.ppm等。如何一口气用bash做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以使用find-exec,但是您将需要一个帮助程序脚本来处理从原始文件名中删除.bz2扩展名并添加{{1 }}扩展名。

您将转到.ppm目录,然后所需的find命令的常规格式为:

newfolder

您的帮助程序脚本将解压缩bzip文件,保留原始文件,并将解压缩的输出重定向到当前目录中的新文件。 (您还应进行最小程度的验证,以确保在盲目尝试解压缩之前将参数传递给$ find /path/to/folder -type f -name "*bz2" -exec /path/to/helper.sh '{}' \; )。辅助脚本可能很简单:

helper.sh

(确保您使#!/bin/bash [ -z "$1" ] && return 1 ## validate argument past [ -r "$1" ] || return 1 ## validate argument is readable file fn="${1##*/}" ## remove path components ## decompress to stdout, preserving original, redirect to new name bzip2 -cdk "$1" > "${fn%.bz2}.ppm" 可执行,例如helper.sh

以包含以下内容的文件夹开头的简短示例:

chmod +x /path/to/helper.sh

,当前目录$ l1 ../folder file1.bz2 file2.bz2 file3.bz2 file4.bz2 为空,父目录中的newfolder为空,

helper.sh

现在,当前目录$ find ../folder -type f -name "*bz2" -exec ../helper.sh '{}' \; 包含原始newfolder文件的解压缩内容:

.bz2

原始$ l1 file1.ppm file2.ppm file3.ppm file4.ppm 文件保留在原始目录.bz2中。

仔细研究一下,如果您有任何疑问,请告诉我。

答案 1 :(得分:1)

这种东西很适合 GNU Parallel

  • 首先,并行执行所有工作,从而使用您花了这么多钱购买的所有可爱的Intel CPU内核,
  • 其次,轻松地从其参数中删除路径,文件名和扩展名,或者生成我真正选择使用的“序列号”
  • 允许您执行“空运行” 来检查外观是否不错,但实际上并未做任何事情,
  • 允许非常简洁的命令不带循环。

因此,您可以这样做:

SELECT p.Name, CASE WHEN isnull(i.Name,'') = '' THEN e.Name ELSE i.Name END 
  FROM Personnel p LEFT JOIN InternalRoles i ON p.InternalRoleID = i.ID 
               LEFT JOIN ExternalRoles e ON p.ExternalRoleID = e.ID 

示例输出

mkdir -p results
find . -name \*.bz2 -print0 | parallel -0 --dry-run 'bzip2 -cdk {} > results/{#}.ppm' 

如果看起来正确,请删除bzip2 -cdk ./folder/folder3/x.bz2 > results/3.ppm bzip2 -cdk ./folder/folder2/x.bz2 > results/2.ppm bzip2 -cdk ./folder/folder1/x.bz2 > results/1.ppm bzip2 -cdk ./folder/folder4/x.bz2 > results/4.ppm 并再次运行以实际解压缩文件。

请注意:

  • --dry-run表示“当前文件”
  • {}表示“ GNU Parallel中的当前作业号”

我提到但未使用的其他变量:

  • {#}表示“当前文件减去扩展名”
  • {.}表示“当前文件的基本名称”
  • {/}表示“当前文件的目录名” ...

请注意,您可能希望在开始时使用{//},因为它会保留输出,从而使输出保持一定的顺序,并避免混淆。