Linux 如何使用tar使用来自用户输入的绝对路径来备份目录?

Linux 如何使用tar使用来自用户输入的绝对路径来备份目录?,linux,bash,backup,Linux,Bash,Backup,我有一个脚本,它将用户输入作为绝对路径(使用fselect对话框) 我曾经 tar cvzf backup.tar.gz $backupdir 但是,这包括绝对目录路径(*1),因此我尝试(使用脚本): 因此,在我的脚本中,我可以使用: pathtodir = dirname $backupdir 要获取备份目录的$PATH,但我需要要备份的目录的名称,即: dirname = .. tar czvf backup.tar.gz -C $PATH $dirname 如何获取$dirnam

我有一个脚本,它将用户输入作为绝对路径(使用fselect对话框)

我曾经

tar cvzf backup.tar.gz $backupdir
但是,这包括绝对目录路径(*1),因此我尝试(使用脚本):

因此,在我的脚本中,我可以使用:

pathtodir = dirname $backupdir 
要获取备份目录的$PATH,但我需要要备份的目录的名称,即:

dirname = ..
tar czvf backup.tar.gz -C $PATH $dirname
如何获取$dirname的名称?


1-“从成员名中删除前导“/”

好吧,老实说,我一开始很难搞清楚这个问题。我认为我们在评论中对其进行了分类

因此,您有
$backupdir
,它包含备份目录的绝对路径,还有
$pathtodir
,它是备份目录的父目录

现在可以在Bash中使用字符串替换,如下所示:

# Replace $pathtodir with empty string inside $backupdir
relativepath=${backupdir//$pathtodir/}
# Now remove the leading slash, if any
relativepath=${relativepath#/}

如果我仍然误解了什么,请告诉我,我会相应地调整答案。

好的,老实说,我一开始很难理解这个问题。我认为我们在评论中对其进行了分类

因此,您有
$backupdir
,它包含备份目录的绝对路径,还有
$pathtodir
,它是备份目录的父目录

现在可以在Bash中使用字符串替换,如下所示:

# Replace $pathtodir with empty string inside $backupdir
relativepath=${backupdir//$pathtodir/}
# Now remove the leading slash, if any
relativepath=${relativepath#/}

如果我仍然误解了什么,请告诉我,我会相应地调整答案。

GNU tar?如果是这样,请查看
--strip components=NUMBER
…以便在包装期间提取<代码>-C可用于这两种情况,AFAIK。即使没有,您也可以在子shell中执行
(cd$dirname&&tar…
(在子shell退出后恢复旧cwd)。哦,我认为争论的顺序可能会起作用。尝试将
-C
作为第一个参数,或者明确地放在
f
及其参数之前。可以比较变量的值吗?i、 e.pathtodir='path/to/dir'backupdir='path/to/dir/backupdir'并以某种方式获得差异,这样我就只剩下'backupdir'?当然:字符串替换,例如${code>${backupdir//$pathtodir/}(但仅在Bash中)。。。旁注:考虑到我们将要讨论的问题,我认为你应该重新表述一下你的问题。我不太清楚这是你想要的。GNU焦油?如果是这样,请查看
--strip components=NUMBER
…以便在包装期间提取<代码>-C可用于这两种情况,AFAIK。即使没有,您也可以在子shell中执行
(cd$dirname&&tar…
(在子shell退出后恢复旧cwd)。哦,我认为争论的顺序可能会起作用。尝试将
-C
作为第一个参数,或者明确地放在
f
及其参数之前。可以比较变量的值吗?i、 e.pathtodir='path/to/dir'backupdir='path/to/dir/backupdir'并以某种方式获得差异,这样我就只剩下'backupdir'?当然:字符串替换,例如${code>${backupdir//$pathtodir/}(但仅在Bash中)。。。旁注:考虑到我们将要讨论的问题,我认为你应该重新表述一下你的问题。我不太清楚这是你想要的。
# Replace $pathtodir with empty string inside $backupdir
relativepath=${backupdir//$pathtodir/}
# Now remove the leading slash, if any
relativepath=${relativepath#/}