Shell 在linux中提取tar时重命名tar.gz中的目录

Shell 在linux中提取tar时重命名tar.gz中的目录,shell,unix,Shell,Unix,我有一个tarball索引.tar.gz。里面有这样的目录 索引1/db\u新时间\u旧时间\u 0 索引1/db\u新时间\u旧时间\u 1 索引1/db\u新时间\u旧时间\u 2 Index2/db\u newtime\u oldtime\u 0 Index2/db\u新时间\u旧时间\u 1 Index2/db\u新时间\u旧时间\u 2 在提取tar文件时,我想在db目录名的末尾添加99,并加上数字值。 所以在提取之后,目录结构应该是这样的 Index1/db\u新时间\u旧时间\u

我有一个tarball索引.tar.gz。里面有这样的目录

索引1/db\u新时间\u旧时间\u 0
索引1/db\u新时间\u旧时间\u 1
索引1/db\u新时间\u旧时间\u 2
Index2/db\u newtime\u oldtime\u 0
Index2/db\u新时间\u旧时间\u 1
Index2/db\u新时间\u旧时间\u 2

在提取tar文件时,我想在db目录名的末尾添加99,并加上数字值。 所以在提取之后,目录结构应该是这样的

Index1/db\u新时间\u旧时间\u 99
索引1/db\u新时间\u旧时间\u 100
索引1/db\u新时间\u旧时间\u 101
Index2/db\u新时间\u旧时间\u 99
Index2/db\u新时间\u旧时间\u 100
Index2/db\u新时间\u旧时间\u 101


那么,可以使用shell脚本像这样重命名吗?

在提取tar ball之后,您只需重命名
index*/
中的每个目录名即可。。。 可以使用for循环来执行此操作:

for i in $(\ls -d index*/*); 
do 
    dst=$(echo "$i" | sed -e 's/oldtime_/oldtime_ /g' | awk '{print $1$2+99}'); 
    mv "$i" "$dst"; 
done

我们来测试一下。如果没有错过任何东西,而焦油压缩

tar -C ./tmp -xvf ./Index.tar.gz
find ./tmp -name "[a-zA-Z_][0-9]" | sed s/([a-zA-Z])([0-9])/\1 \2 | awk '{print "mv "$1$2" "$1$2+99}'
cd ./tmp && tar -zxf ../Index.tar.gz . && cd ../ && rm -rf ./tmp
注: 是的,AWK支持数学:)

使用Bash:

tar -vxf Index.tar.gz | (
    R='^(.*[^0-9])([0-9]+)$'
    read A
    while [[ -n $A ]]; do
        read B
        [[ $A =~ $R ]] && echo mv "$A" "${BASH_REMATCH[1]}$(( BASH_REMATCH[2] + 99 ))"
        A=$B
    done
)
注意:
-v
很重要。移除
echo
附近的
mv
,如果它似乎已经工作正常