如何通過 crontab 定期更新符號連結 (ln -sf)
背景
我要使用的PNG圖像文件根據日期儲存在目錄中,例如:
/NAS-mein/data/201812/
PNG儲存在其中
/NAS-mein/data/201812/foo/bar/20181231_1500.png
所以我
PNG_path
在我的主目錄中創建了一個符號連結
ln -s /NAS-mein/data/201812/ PNG_path
我可以通過以下方式手動更新它:
ln -sf /NAS-mein/data/201812/ PNG_path
工作正常並返回``PNG_path’ ->
/NAS-mein/data/201812'
我在 CentOS 6.7 環境中,我沒有超級使用者權限。
目標目錄由其他人創建,但授予 777 權限,即:
drwxrwxrwx /NAS-mein/
drwxrwxrwx /NAS-mein/data/
drwxrwxrwx /NAS-mein/data/201812/
使用 crontab
然後我嘗試在每月的第一天自動更新這個符號連結,所以它總是會將我重定向到目前日期的目錄。
我嘗試在 crontab 中開始一項工作,例如:
0 0 1 * * ln -sf /NAS-mein/data/$(date "+%Y%m") /home/me/PNG_path >>/home/me/.pngln.log 2>>&1
但這不起作用,即使沒有向日誌提供任何資訊。
所以我嘗試了:
0 0 1 * * cd /home/me/ && ln -sf /NAS-mein/data/$(date "+%Y%m") PNG_path >>.pngln.log 2>>&1
並將其包裝成一個 Bash 腳本,例如:
#!/bin/bash /bin/unlink "/home/me/PNG_path" /bin/ln -sf /NAS-mein/data/$(date "+%Y%m") PNG_path >>/home/me/.pngln.log 2>>&1
但以上所有似乎都不起作用,因為符號連結沒有改變,也沒有記錄任何資訊(即
.pngln.log
無論如何都沒有創建。)我不確定我在哪裡做錯了,或者使用
ln
incrontab
不是合法用途?編輯:我注意到我沒有寫出最可疑的部分:在
ln
表達式中使用日期函式。
百分號在 crontab 中很特殊,如果您將
date
命令放在那裡,則需要對其進行轉義(請參閱 參考資料man 5 crontab
)。您的符號連結指向一個目錄。當您
ln
再次執行時,它會將連結放在該目錄中。例子:
$ mkdir real $ ln -sf real link $ tree . |-- link -> real `-- real 1 directory, 1 file
$ ln -sf real link $ tree . |-- link -> real `-- real `-- real -> real 1 directory, 2 files
解決方案是在 Linux 或任何帶有 GNU coreutils’ 的系統上使用
ln
with-n
(或) ,並在 BSD 上使用 with。這將導致在創建新連結之前不會進入連結指向的目錄。--no-dereference``ln``-h``ln
一個可移植的解決方案是首先使用以下方式顯式刪除連結
rm
:ln -s some_directory link
之後:
rm link && ln -s some_directory link