Bash提取tar.gz文件

时间:2018-08-23 16:13:44

标签: bash extract tar synology

一开始对我的英语很抱歉,我希望每个人都明白我的问题:)

我的tar文件位于:

/volume1/@appstore/SynoDSApps/archiv/DE/2018_08_18__Lysto BackUp.tar.gz

使用tar命令:

tar -tf "/volume1/@appstore/SynoDSApps/archiv/DE/2018_08_18__Lysto BackUp.tar.gz"

命令显示给我:

/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/webapp/
/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/webapp/exit_codes/
/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/webapp/exit_codes/code_FUNC
/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/webapp/exit_codes/code_SCRI
/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/webapp/login/
/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/webapp/login/check_appprivilege.php
/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/webapp/login/check_login.php
/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/webapp/login/privilege.php
/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/webapp/scripte/
/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/webapp/scripte/Lysto BackUp/
/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/webapp/scripte/Lysto BackUp/sys
/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/webapp/scripte/Lysto BackUp/sys_func
/volume1/02_public/3rd_Party_Apps/SPK_SCRIPTS/SynoDSApps/SSH_ERROR

我的计划,或者更好的是,我希望这样处理:

IFS=$'\n'
for PATHS in $(tar -tPf "/volume1/@appstore/SynoDSApps/archiv/DE/2018_08_18__Lysto BackUp.tar.gz")
do
    SED=$(echo "$PATHS" | sed 's/.*\///')
    if [[ -n "$SED" ]]
    then
        tar -C "${target_archiv}" -xvf "/volume1/@appstore/SynoDSApps/archiv/DE/2018_08_18__Lysto BackUp.tar.gz" "$PATHS"
        #echo JA
        echo "$PATHS"
    fi
done
unset IFS

我只需要tar的一个文件,并将其存储到其他目录中。 但是带-C的命令不起作用...它解压缩了tar的所有文件。...

我的问题是,是否可以仅将没有cd的Tar文件提取到目录中? 或其他问题是否有可能只提取没有文件夹的tar文件,这也许是更好的方法,但我不知道如何...。

没有,我无法在没有路径的情况下对文件进行压缩,我需要它们... 所以这对我来说是不可能的...

我希望在这里有所帮助:)

1 个答案:

答案 0 :(得分:0)

如果最终目的是提取没有完整路径的文件,则可以使用类似SED的表达式在提取文件时使用--xform选项重命名文件:

tar -C "${target_archiv}" -xvf "/volume1/@appstore/SynoDSApps/archiv/DE/2018_08_18__Lysto BackUp.tar.gz" --xform='s,^.*/,,'

's,^.*/,,'表达式要求从文件名(s的开头替换(^),捕获所有内容(.*)并在最后一个斜杠( /),然后将其替换为任何内容。换句话说,它从文件名中删除了目录结构。

如果要摆脱已提取的空文件夹,可以在提取后调用此命令:

find "${target_archiv}" -mindepth 1 -maxdepth 1 -type d -exec rmdir {} \;

请记住,它将删除“ $ {target_archiv}”的所有(空)子文件夹,甚至包括在提取压缩包之前已经存在的子文件夹。但是,由于rmdir不会删除包含文件的目录,因此对您拥有的子目录几乎没有害处。