从存档中删除文件夹结构,存档时忽略文件夹并修复错误

从存档中删除文件夹结构,存档时忽略文件夹并修复错误

我正在尝试编写一个脚本将我的每个 plesk 主机备份到单独的文件中,但遇到了两个问题:

  1. 我想从存档中删除文件夹结构,tar 有 3 个文件夹深
  2. 我收到此错误:tar:从成员名称中删除前导“/”
  3. 我需要我的档案忽略名为“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:从成员名称中删除前导“/”

这更像是一个警告,如果你遵循第一个建议,你就不会再收到它

相关内容