批量解压缩包含要转义的标志的文件,并使用regexp重命名创建的文件夹

时间:2014-10-22 15:42:22

标签: macos bash shell

我需要创建一个简单的bash one line sript,如下所示:

  1. 查找文件夹
  2. 中的所有zip文件
  3. 解压缩每个文件
  4. 重命名结果文件夹。
  5. 第一部分很简单:

    find . -type f -name '*.zip'
    

    问题接下来,因为文件看起来像这样:

    ab_firstname_somestring_A!1.zip
    ab_secondname_somestring_A!1.zip
    ab_thirddname_somestring_A1.zip
    

    等。使用xargs时出现问题 - 当它没有收到转义的文件名时,它不会提取它们。 最后一个有问题的步骤是重命名 - 结果文件夹将与原始zip文件完全相同,最后没有.zip,我想在此过程中重命名,因此只剩下这部分:

    firstname
    secondname
    thirdname
    

    唯一已知的 - 名称将介于第一个_和第二个_。

    之间

1 个答案:

答案 0 :(得分:1)

扩展我的评论。我认为你正在寻找像

这样的东西
find . -type f -name '*.zip' -exec bash -c \
  ' tar -xzf "$1" && f=$1 && f=${f#*_} && mv -iv -- "${1%%.zip}" "${f%%_*}" ' \
bash {} \;

如果您想对其他zip档案执行其他操作,则可以执行此类操作

find . -type f -name '*.zip' -exec bash -c ' \
    if [[ $1 =~ _(.*)_(.*)_ ]]; then \
        tar -xzf "$1" && mv -iv -- "${1%%.zip}" "${BASH_REMATCH[1]}"; \
    else \
        : #Do something else with other zip archives, that don't have 3 underscores
    fi ' \
bash {} \;

e.g。

> tree
.
├── ab_firstname_somestring_A!1.zip
├── ab_secondname_somestring_A!1.zip
└── ab_thirddname_somestring_A1.zip

0 directories, 3 files
>    find . -type f -name '*.zip' -exec bash -c \
>       ' tar -xzf "$1" && f=$1 && f=${f#*_} && mv -iv -- "${1%%.zip}" "${f%%_*}" ' \
>     bash {} \;
‘./ab_firstname_somestring_A!1’ -> ‘firstname’
‘./ab_secondname_somestring_A!1’ -> ‘secondname’
‘./ab_thirddname_somestring_A1’ -> ‘thirddname’