2010-12-10 3 views
3

指定した3または4以外の複数のディレクトリにまたがるSSH経由でbashコマンドを実行できますか?ような何か:ディレクトリをループするためのSSHコマンド

は、私はHostgatorの専用のLinuxサーバー上で午前/home/exception1/除く/home/内のすべてのディレクトリについてpublic_html/outdated//home/exception2//home/exception3/

を削除します。

+0

あなたはおそらく、あなたが正しい –

+0

'/時代遅れの' public_htmlの/上の最初のスラッシュを持っているつもりはない、私はそれを修正し、あなたに@Dennisウィリアムソンに感謝します。 – filip

答えて

2

テスト初!

shopt -s extglob 
rm -rf /home/!(exception1|exception2|exception3)/public_html/outdated/ 
+0

これは華やかで簡単です。あなたが例外のリストで 'home'ディレクトリを繰り返す必要があるかどうかはわかりません。少なくとも私はそれを '(exception1 | exception2 | exception3)'に変更するまで、少なくとも私にとってはうまくいきませんでした。 – filip

+0

また、 '!'演算子を動作させるために 'shopt -s extglob'を実行する必要がありましたが、今はうまくいきます。 – filip

+0

申し訳ありませんが、私はあなたの質問から考えずにコピーして貼り付けていました。また、申し訳ありませんが、extglobについて言及するのを忘れました。私は私の答えを訂正します。 –

1

ここには簡単な解決策があります。おそらくこれを行うより良い方法があります。

cd /home 
ls */public_html/outdated 

あなたはそれらすべてをお勧めします。あなたはその

から
ls */public_html/outdated | grep -Ev ^exception1/ | grep -Ev ^exception2/ | grep -Ev ^exception3/ 

を行を削除してから、あなたが実際にそれらを削除する前に明らかにあなたがリストを確認するために、中間のステップを実行する必要がありますrm -rf

rm -rf `ls */public_html/outdated | grep -Ev ^exception1/ | grep -Ev ^exception2/ | grep -Ev ^exception3/` 

にこれらを養うためにバッククォートを使用するためにはgrep -vを使用することができます!

あなたのディレクトリに空白が入っていると、これはうまくいかないことに注意してください。 -/homeのユーザ名はスペースではありません。安全な方法はfindです。 (そこ検索で除外を行う方法は、おそらくだが、私が覚えていることはありません。)

3

これは、すべて1行ですが、私は強くこれを実行する前に、読みやすさ

find /home 
    \(-wholename '/home/exception1' 
    -o -wholename '/home/exception2' 
    -o -wholename '/home/exception3' \) 
    -prune -o 
    -wholename '*/public_html/outdated' -type d 
    -exec rm -rvf \{} \; 

ためにここでそれを分割しました-exec rm -rvf \{} \;ビットを-printに置き換えて、削除するものだけを印刷することを確認することをお勧めします。

これはどのように動作するのですか:findは再帰的に物を見つけます。 \( ... \)' matches directories you want to skip entirely (ie: prune). The standard pattern for using -prune is to say what you want to prune out, then -prune -o`で、実際に一致させたいものを入力してください。

public_html/outdatedディレクトリと一致するように、-wholename '*/public_html/outdated' -type dが対象です。 (-type dは "ディレクトリです"を意味します)。

最後に実行したい操作があります。もう一度、この部分を-printに置き換えます。

1つの警告:これは、フォームの警告の束を吐き出します:

find: `/home/foo/public_html/outdated': No such file or directory 

発見はそれだけで削除されたこれらのディレクトリに歩くしようとしているためです。これらを無視しても問題ありません。警告が表示されても検索は続行されます。

+0

'-exec'の代わりに' -execdir'を '-depth'と一緒に使って、エラーメッセージを排除するかどうか試してみることができます。 –

+0

@Dennis私はexecdirを試していませんでしたが、問題を解決する可能性があると思って '-depth'と遊んでいました(私たちが削除した時点でサブツリーを使っているので)。しかし、これは完全に剪定を破るように見えたので、私はそのアプローチを断念しました。 –

関連する問題