正如标题所解释的,我需要每天将一个文件放入 zip 存档中;此外,还必须将 zip 文件移动到 /var/www/html,其中 .php 脚本允许用户下载它。
假设:
- 该文件的绝对路径是
/home/myuser/working-directory/file.txt
- 我把需要使用 cronjobs 运行的所有脚本文件放在
/usr/scripts
- 我使用 而不是 来编写以下 cronjob
sudo crontab -e
,crontab -e
因为 /var/www/html 需要管理权限
我的思考结果如下:
create-zip.sh
#!/bin/bash
cp /home/myuser/myworkingdir/file.txt /home/myuser/file.txt && cd /home/myuser && zip my-zip-file-$(date "+%b_%d_%Y_%H.%M.%S").zip file.txt && rm file.txt && rm /var/www/html/my-zip-file*.zip && mv my-zip-file*.zip /var/www/html && cd
sudo crontab -e
@daily sh /usr/scripts/create-zip.sh
嗯……它不起作用。我认为问题与权限有关,因为我被file.txt
复制到了/home/myuser
,并且创建了 zip。但是我无法将 zip 移动到/var/www/html
,即使 crontab 是在 Root 权限下运行。
任何想法?
另外,由于 .zip 文件每天创建一次,我需要先从 /var/www/html 中删除之前的 .zip 文件,然后再将新的 .zip 文件移到那里。我尝试使用
rm /var/www/html my-zip-file-*.zip
(检查上面的 create-zip.sh)但是它也不起作用...所以我猜是权限问题。/var/www/html 属于 www-data 组,其所有者也是 www-data。
答案1
使用 连接命令&&
意味着只有左侧命令成功执行后,右侧命令才会运行。这意味着您的 crontab 第一次运行时会失败,因为没有 zip 文件,/var/www/html/
因此rm /var/www/html/my-zip-file*.zip
会失败,并且mv
不会被执行。
因此,您可以创建一个可删除的正确名称的文件并保留相同的 cron 命令:
touch /var/www/html/my-zip-file.zip
或者,你可以;
使用&&
:
cp /home/myuser/myworkingdir/file.txt /home/myuser/file.txt &&
cd /home/myuser &&
zip my-zip-file-$(date "+%b_%d_%Y_%H.%M.%S").zip file.txt &&
rm file.txt &&
rm /var/www/html/my-zip-file*.zip ;
mv my-zip-file*.zip /var/www/html && cd
您还使这种方法变得比它需要的更复杂。复制/home/myuser/myworkingdir/file.txt
to/home/myuser/file.txt
是不必要的,因为您只使用它来压缩它,然后删除它。cd
不需要命令,您可以使用完整路径。cd
最后也没有理由。您只需要一个命令从目标目录中删除任何 zip 文件,以及一个命令来压缩它们:
rm /var/www/html/my-zip-file*.zip &&
zip /var/www/htmlmy-zip-file-$(date "+%b_%d_%Y_%H.%M.%S").zip /home/myuser/myworkingdir/file.txt