我需要创建一个简单的bash one line sript,如下所示:
第一部分很简单:
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
唯一已知的 - 名称将介于第一个_和第二个_。
之间答案 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’