我正在尝试测试我要创建的 tar 文件是否已经存在。如果没有,那么我想创建 tar 文件(这部分代码有效)。但是,测试 tar 文件的文件名是否存在的 if 语句不起作用(实际上并不测试 tar 文件是否存在,只是直接跳到 else 语句,即使 tar 文件已经存在)。有任何想法吗?
注意:fire_dir_name 是我们尝试压缩的文件的名称(即)myfile1.txt
#create variable for new name of file/dir
date=$(date +"%Y%m%d")
new_name="$file_dir_name.$date"
file_name="$new_name.tar"
echo $file_name
#check if tar file exists already
if [ -f "$file_name" ]
then
echo "$file_name" exists
else
# create tar file
tar -cvf $dir_path/$new_name.tar $file_dir_name -C $dir_path
答案1
这里的关键是您必须测试您正在创建的相同文件名
#check if tar file exists already
if [ -f "$file_name" ]
then
...
else
# create tar file
tar -cvf "$file_name" ...
...
fi
此外,没有理由file_name
不能成为完整路径。
file_name="$dir_path/$new_name.tar"
将目录放入变量名中可能不太容易出错。调用变量tar_name
或tar_path
类似的东西可能是更好的风格。
答案2
如果我们忽略您错过该子句的部分fi
,则问题的本质就围绕在您调用 之前tar
。
假设你想要
创建一个名为
$newname
对于目录条目
$file_dir_name
里面
$dir_path
你应该cd
首先$dir_path
.我不确定该-C
标志是否可移植,但较新的pax
命令没有它,原因很明显是为了降低复杂性。
使用-C
标志还有另一个问题:如果 $dir_path 是相对的,它会在错误的位置创建 tarball。
我猜你的文件存在检查失败的原因是你没有更改到$file_name
应该存在的目录。
接下来,将输出目标指定为 tarball 的文件名,并将$file_dir_name
as 操作数指定为tar/pax
命令。
改进的命令:
...
#check if tar file exists already
cd "$dir_path"
if [ -f "$file_name" ]
then echo "$file_name" exists
else
pax -w -f "$file_name" "$file_dir_name"
## alternatively, with tar:
# tar cf "$file_name" "$file_dir_name"
fi
在这一点上,我想指出变量名称$file_name
有点太通用了,它可以更改为类似$tarball
.
作为奖励,您可以考虑缩短变量名称:
$wd
是您期望的工作目录的好名称,它既不与cd
也不冲突pwd
我经常仅用于
$f
文件或任何“目录条目”;同样,$d
对于目录操作数。