LFTP でパーミッションを一括変換する

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 に

https://stackoverflow.com/questions/13859799/lftp-how-to-recursively-set-permissions-firstly-by-directory-than-by-file

って記事があった。

おおっ、なるほど。 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 で見つけた方法に感動したので、紹介してみました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です