使用 tar 命令按期限归档文件

使用 tar 命令按期限归档文件

大厅,

我尝试存档超过特定期限的文件,当我尝试解压 tar 文件时,它会保留根文件夹的目录结构。我不想保留父文件夹

使用的命令:

find /home/prj/myfolder/* -mtime 1 -type f | 
    while read file; 
    do
        tar -Pcvzf archive.tar.gz --remove-files "$file"
    done

问题:文件位置是 /home/prj/myfolder/abc/a.txt,当我解压 archive.tar.gz 时,它包含 /home/prj/myfolder/abc/a.txt 目录结构。

我期待 abc/a.txt

答案1

删除“/home/prj/myfolder/*”并使用“cd /home/prj/myfolder/”导航到该位置。

cd /home/prj/myfolder/
find . -mtime 1 -type f | 
    while read file; 
    do
        tar -Pcvzf archive.tar.gz --remove-files "$file"
    done

然后文件将以相对路径存储。

答案2

我会使用 Rinzwind 的答案中的解决方案。没有真正的理由避免使用cd; 特别是如果您将其放在 shell 脚本中,因为 只会cd影响脚本,而不会影响您从中调用脚本的 shell。

如果你真的不想使用cd,你可以使用tars--transform选项:

gbl@roran:~$ tar -cf /tmp/archive.tar /home/gbl/Temp/a.out
gbl@roran:~$ tar -tf /tmp/archive.tar
home/gbl/Temp/a.out

gbl@roran:~$ tar --transform 's/^home\/gbl//' -cf /tmp/archive2.tar /home/gbl/Temp/a.out
gbl@roran:~$ tar -tf /tmp/archive2.tar
/Temp/a.out

gbl@roran:~$ tar --transform 's/^home\/gbl\///' -cf /tmp/archive3.tar /home/gbl/Temp/a.out
gbl@roran:~$ tar -tf /tmp/archive3.tar
Temp/a.out

tar: Removing leading '/' from member names在这里省略了一些消息,因为它们对答案没有帮助。

使用任何sed正则表达式进行转换,阅读手册以了解更多选项。

还可以--strip-components从文件名开头删除那么多路径组件,但它只在提取时有效,而不是在创建档案时有效。

但是,这仅限于 gnu tar,因此在 Linux 上没问题,但当您切换到 MacOS、Solaris 或 AIX 时可能就不行了。这是避免使用它的另一个原因,尤其是因为有一个简单的不同解决方案(cd第一个)。

相关内容