![从存档中删除文件夹结构,存档时忽略文件夹并修复错误](https://linux22.com/image/1382562/%E4%BB%8E%E5%AD%98%E6%A1%A3%E4%B8%AD%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E5%A4%B9%E7%BB%93%E6%9E%84%EF%BC%8C%E5%AD%98%E6%A1%A3%E6%97%B6%E5%BF%BD%E7%95%A5%E6%96%87%E4%BB%B6%E5%A4%B9%E5%B9%B6%E4%BF%AE%E5%A4%8D%E9%94%99%E8%AF%AF.png)
我正在尝试编写一个脚本将我的每个 plesk 主机备份到单独的文件中,但遇到了两个问题:
- 我想从存档中删除文件夹结构,tar 有 3 个文件夹深
- 我收到此错误:tar:从成员名称中删除前导“/”
- 我需要我的档案忽略名为“catch”的文件夹,因为我的档案中不需要它们。
代码:
FILES=/var/www/vhosts/*
FNAME=""
for f in $FILES
do
FNAME=`basename $f`
tar cfv "/root/backup/ftp/$FNAME.tar" $f
done
示例输出:
tar: Removing leading `/' from member names
/var/www/vhosts/mydomain.com/
/var/www/vhosts/mydomain.com/conf
/var/www/vhosts/mydomain.com/etc/
/var/www/vhosts/mydomain.com/etc/group
/var/www/vhosts/mydomain.com/etc/termcap
/var/www/vhosts/mydomain.com/etc/passwd
/var/www/vhosts/mydomain.com/usr/
答案1
与往常一样,在 Linux 中,一个命令即可完成:
for i in $(find /path/to/source/dir -type f -exec echo {} \;) ; do tar -c -f path/to/dest/directory/${i##*/}.tar -C ${i%/*} ${i##*/} ; done
确保源目录是通过其完整路径名而不是相对路径名指定的;其余的很明显,我已经大量使用了 shell 替换功能。
编辑:在我写回复时,另一个答案说不能删除目录结构。这是不正确的,tar 中的 -F 选项正是这样做的。使用此命令,可以找到来自 /path/to/source/directory 中目录树的所有文件,它们都经过适当的 tar 处理,并整齐地堆放在无分支目录 /path/to/dest/directory 中。
编辑:所请求的更改,即排除名称以 catch 开头的文件,可以通过以下命令完成:
for i in $(find /path/to/source/dir -type f ! -name 'catch*' -exec echo {} \;) ; do tar -c -f path/to/dest/directory/${i##*/}.tar -C ${i%/*} ${i##*/} ; done
如果您想避免使用以 catch 结尾的文件,请将 catch* 替换为 *catch,我相信您明白了。
答案2
我想从存档中删除文件夹结构,tar 有 3 个文件夹深
你不能。 cd 到目标目录或上一级,然后运行 tar on ./$f
我收到此错误:tar:从成员名称中删除前导“/”
这更像是一个警告,如果你遵循第一个建议,你就不会再收到它