私のサーバーに100のJoomla Webサイトがあり、すべてのJoomlaキャッシュフォルダを整理したいと思います。これを行うには、次のコマンドが必要です。
1-「cache」という名前のすべてのディレクトリを探します。
たとえば、「/home/demo/」ディレクトリを検索すると
最大1つのレベルより深い「キャッシュ」ディレクトリを見つけます。たとえば、次のようになります。
/home/demo/ddf3e/
/home/demo/awda2/
これより深くなることはない
2-「キャッシュ」ディレクトリ内のすべてのファイルとディレクトリをクリーンアップします。
削除したいものだけを削除それ自体ではありません
サム -すべての "cache" ディレクトリに "index.html" ファイルを作成します。
事前にありがとう
答え1
最もPOSIXアプローチは、おそらくfind
複数の-exec
オプションを持つコマンドを使用することです。
修正する:完全なPOSIXソリューションはこの記事の最後にあります。
次のパスの下に「cache」というネストしたディレクトリを見つけることができます/home/demo
。
find /home/demo -mindepth 2 -maxdepth 2 -type d -name cache
mindepth
maxdepth
値は検索2
を直接サブディレクトリに制限します。-type d
ディレクトリのみを検索するように指定-name cache
名前が正確に「cache」の一致のみを返すように指示します。
その後、この-exec
オプションを使用して、一致する結果に基づいて操作を実行できます。たとえば、ls
一致する各キャッシュディレクトリの内容を一覧表示するために実行する場合:
find /home/demo -mindepth 2 -maxdepth 2 -type d -name cache -exec ls {} \;
-exec
ls
各一致に対して、次のコマンドと()を順番に呼び出します。{}
一致する値を返します(この場合はキャッシュディレクトリパス)。\;
一致するたびにコマンドを1回実行するように指示します。
したがって、そのディレクトリの内容を削除するには、上記のls
コマンドを次のrm
適切なステートメントに置き換えることができます。sh -c 'rm "{}"/*'
はい(これを実行しないでください):
find /home/demo -maxdepth 2 -mindepth 2 -type d -name cache -exec sh -c 'rm "{}"/* 2>/dev/null' \;
上記の例では、sh -c
これはシェル拡張がネストされたファイルと一致するようにするために使用されます/*
(POSIXではありません)。その後、別のファイルを追加して追加の-exec
ファイルを作成することもできます。
はい(これを実行しないでください):
find /home/demo -maxdepth 2 -mindepth 2 -type d -name cache -exec sh -c 'rm "{}"/* 2>/dev/null' \; -exec touch "{}/index.html" \;
上記の例では、両方の-exec
オプションが一緒に使用されました。 2番目のコマンドは、index.html
最初のコマンドが正常に完了した場合にのみ実行されるネストされたファイルを作成します-exec
。
ただし、複数の検索コマンドに分割することをお勧めします。 1つはファイルを一致させ、削除し、もう1つはindex.html
。
はい(これを実行しないでください):
find /home/demo -mindepth 3 -maxdepth 3 -wholename "/home/demo/*/cache/*" -exec rm -rf "{}" \;
find /home/demo -maxdepth 2 -mindepth 2 -type d -name cache -exec touch "{}/index.html" \;
最初の文で:
-mindepth
子の子だけが一致します-maxdepth
。3
-wholename "/home/demo/*/cache/*"
ターゲットキャッシュディレクトリのサブディレクトリと一致するエントリを提供します。
次に、2番目のステートメントはindex.html
ファイルを生成します。
あなたの質問を正しく理解したら、このコマンドは次のように役立ちます。おそらくあなたが探しているものをしてください。ただし、使用する前に注意深く読んで、完全に理解していることを確認してください。
どのコマンドを実行する前に、コマンドの前にプレフィックスを付けることをお勧めしますrm
。これにより、練習を行い、実行中の作業を確認できます。touch
echo
はい(安全なテスト実行に使用echo
):
find /home/demo -mindepth 3 -maxdepth 3 -wholename "/home/demo/*/cache/*" -exec echo rm -rf "{}" \;
find /home/demo -maxdepth 2 -mindepth 2 -type d -name cache -exec echo touch "{}/index.html" \;
アップデート - 完全なPOSIXソリューション(ただし、読みにくい):
完全なPOSIXに該当する場合(mindepth
/除く)、内部ワイルドカードを使用して正/負の組み合わせを使用maxdepth
できます。wholename
-path
find
cd
globパターンのデフォルトディレクトリを計算する必要はないので、まず作業ツリーに移動する方がはるかに簡単です。
cd /home/demo
find . -path "./*/cache/*" ! -path "./*/*/*/*" -exec echo rm -rf {} \;
find . -type d -path "./*/cache" ! -path "./*/*/*" -exec echo touch {}/index.html \;
echo
期待した結果が得られたら、次の文を削除してください。
答え2
/home/demo/foo/cache
だから私が推測したものが正しい場合は、たとえば、すべての値を探したいと思いますfoo
。深く掘る必要がないのでとても簡単です。
(1)Shell globを使用して一覧表示できます。
$ cd /home/demo
$ echo */cache
-foo
ダッシュ()で始まる名前などの奇妙な名前を防ぐには、を使用することをお勧めします./*
。あるいは、bashでを使用してドットで始まる名前を含むglobを作成することもできますshopt -s dotglob
。
(2)ディレクトリ内のファイルを見つけて削除します(GNU findを使用すると、-mindepth 1
ファイルはディレクトリ自体と一致しません)。
$ shopt -s dotglob
$ find ./*/cache -mindepth 1 # list them
./awda2/cache/foo
[...]
$ find ./*/cache -mindepth 1 -delete # delete them...
ただ使用することもできますが、rm
ファイル数が多い場合は、コマンドラインの長さ制限を超えることがあります。
$ rm -r ./*/cache/*
(3)すべての項目にファイルを作成またはコピーします(touch
空のファイルを作成)。
$ for dir in ./*/cache ; do touch "$dir/index.html" ; done
$ for dir in ./*/cache ; do cp index.html.model "$dir/index.html" ; done
(ある場合文書(ディレクトリではない)名前を指定するcache
と、無害なエラーが発生します。 )