大厅,
我尝试存档超过特定期限的文件,当我尝试解压 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
,你可以使用tar
s--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
第一个)。