ssh が使えれば簡単なんだが
ssh が使えないレンタルサーバで、lftp で一括でパーミッションを変更したいという事態に。たとえばフォルダは 705 、ファイルは 604 っていう風に。
ssh が使えるのであれば、目的のディレクトリに移動して
$ find . -type d | xargs chmod 705
$ find . -type f | xargs chmod 604
とすれば、それぞれディレクトリとファイルのパーミッションが一括で変換される。
lftp でも hoge というディレクトリがあるとして
lftp > chmod -R 705 hoge
とすれば、一括でパーミッションは hoge ディレクトリもサブディレクトリもファイルも 705 になってしまう。
lftp でも find コマンドは用意されているんだけど、試したところ ssh のようには行かない。
そこでちょっとググってみたところ、Stack Overflow に
って記事があった。
おおっ、なるほど。 lftp 内で find | grep “/$” でディレクトリ一覧を取得(grep “/$” でスラッシュで終わるものを抽出。ファイル一覧はそれに一致しないということで find | grep -v “/$” で取得)。それを awk に渡して chmod ~ というテキストを生成、さらにそれを再度 lftp に渡す。
こんなことわからないよってことで、この記事を参考に、凡人の私も試してみた。
まず目的のサーバ(ここでは hogehoge.net とする)の目的のディレクトリ ( /web 以下のファイルやディクレトリを変更とする) を、 lftp のブックマークで hoge_server として登録して、
$ lftp hoge_server
で hoge@hogehoge.net:/web に接続できるようにしておく。
上記の例ではディレクトリに移動することになっているけど、このようにブックマークしておくと、その必要がないので、次のようなスクリプトを書く。
#!/bin/sh
server="hoge_server"
{
{
lftp "${server}" <<EOF
find | grep "/$"
quit
EOF
} | awk '{ printf "chmod 705 \"%s\"\n", $0 }'
{
lftp "${server}" <<EOF
find | grep -v "/$"
quit
EOF
} | awk '{ printf "chmod 604 \"%s\"\n", $0 }'
} | lftp "${server}"
それで、このスクリプトを実行すると、おおっ見事に変わった。すげぇよ。
参照元でも言っているけど、最後の「 | lftp “${server}” 」無しにして無事一覧を取得できるか、動作確認をしてみたほうがいいだろう。
もっとも私のレベルではベタな方法のほうが安心…
とはいえ、私程度のレベルではちょっと怖いかなと。
ということで、一旦 lftp の mirror コマンドで全体を ssh が使える手元のサーバに落とす。
それで最初の方法でパーミッションを変更。そこで単に lftp で
lftp > mirror -R
としてもパーミッションは変わらないので(ディレクトリは変わる?)、次のようにして
mirror -R –transfer-all
と –transfer-all オプションを付けて、要はすべてアップし直す。
私のような凡人では、転送量とか気にすることがなければこっちのほうが安心ですなあ、ってところだけど、つねづね、lftp って一括でパーミッション変更できないだよねと思っていて、今回 Stack Overflow で見つけた方法に感動したので、紹介してみました。