crontab(ln -sf)を介してシンボリックリンクを定期的に更新する方法

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/

スケジュールされたジョブの使用

その後、毎月1日にこのシンボリックリンクを自動的に更新しようとするため、常に現在の日付のディレクトリにリダイレクトされます。
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で使用しているのでしょうか?crontab

編集:最も疑わしい部分、つまり式にln日付関数を使用する部分を作成していないことがわかりました。

ベストアンサー1

パーセント記号は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、またはBSDを持つすべてのシステムでln(または)使用することです。-nこれにより、新しいリンクが作成されるまでリンクが指すディレクトリに移動しなくなります。--no-dereferenceln-hln

移植可能な解決策は、まず以下を使用して明示的にリンクを削除することですrm

ln -s some_directory link

後:

rm link && ln -s some_directory link

おすすめ記事