NASに溜まる.DS_Storeや._*ファイルを自動削除

Category: Tech
thumbnail

LinuxサーバーにSambaでNASを構築して、主にパソコン間のファイルの共有に使っています。

概ね問題はないのですが、少し気になるのがmacが勝手に隠しファイルを生成してしまうことです。具体的には.DS_Store1._{何かしらのファイル名}の2種類です。
macでは特殊なファイル扱いで表示されませんが、Linuxでは普通に表示されてしまいます。自分はNASで隠しファイルを使わないので以前は許容していたのですが、このサイトの画像などはNAS上の/Publicmoris.day/filesにマウントすることで公開しているので、サイト上に無駄な隠しファイルが表示されてしまい、さすがに目障りに感じるようになりました。

.DS_Storeの生成を止める

.DS_Storeの方は以下のコマンドでネットワークストレージ上に生成することを止められます。

defaults write com.apple.desktopservices DSDontWriteNetworkStores True
killall Finder

しかし、._*ファイルについては停止する手段が無いようです。

自動削除

仕方ないのでサーバーで自動削除するserviceを作成しました。

コマンド

まず、findコマンドで検索して削除するシェルスクリプトを作りました。
/home/Share/の部分は隠しファイルを削除したいディレクトリに変更してください

/usr/local/bin/rmds

#!/bin/sh

find /home/Share/ -name '._*'       -type f -ls -delete
find /home/Share/ -name '.DS_Store' -type f -ls -delete

実行権限を与えます

sudo chown root:root /usr/local/bin/rmds
sudo chmod a+x /usr/local/bin/rmds

systemd unit作成

先ほどのrmdsコマンドを実行するserviceファイルと、それを定期的に起動させるtimerファイルを作成します。
この例では、毎日0時に実行されます。

/etc/systemd/system/rmds.service

[Unit]
Description=Remove .DS_Store and ._* files

[Service]
Type=oneshot
ExecStart=/usr/local/bin/rmds

[Install]
WantedBy=multi-user.target

/etc/systemd/system/rmds.timer

[Unit]
Description=rmds.service timer

[Timer]
OnCalendar=*-*-* 00:00:00

[Install]
WantedBy=timers.target

有効化

service file読み込み

sudo systemctl daemon-reload

timer有効化

.serviceを有効化する必要はありません。

sudo systemctl enable rmds.timer
sudo systemctl start rmds.timer

ログを見てみると削除されていることが確認できました。

sudo journalctl -u rmds

おまけ

macOSのSMBにはバグがあり、速度が遅くなっているそうです。
macの/etc/nsmb.confに以下を追記、再接続すると適用されます。

[default]
signing_required=no

自分はNASで巨大なファイルを扱うことがあまりないので速くなったかはわかりませんが、ファイルを開いたときの応答が速くなり、クイックルックでプレビューしたときにフリーズすることがなくなりました。

参考: https://support.apple.com/ja-jp/101442

Footnotes

  1. DS_StoreのDSはおそらくDesktop Serviceの略