同じ名前のすべてのディレクトリを見つけ、centosからすべてを削除します。

同じ名前のすべてのディレクトリを見つけ、centosからすべてを削除します。

私のサーバーに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
  • mindepthmaxdepth値は検索2を直接サブディレクトリに制限します。
  • -type dディレクトリのみを検索するように指定
  • -name cache名前が正確に「cache」の一致のみを返すように指示します。

その後、この-execオプションを使用して、一致する結果に基づいて操作を実行できます。たとえば、ls一致する各キャッシュディレクトリの内容を一覧表示するために実行する場合:

find /home/demo -mindepth 2 -maxdepth 2 -type d -name cache -exec ls {} \;
  • -execls各一致に対して、次のコマンドと()を順番に呼び出します。
  • {}一致する値を返します(この場合はキャッシュディレクトリパス)。
  • \;一致するたびにコマンドを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子の子だけが一致します-maxdepth3
  • -wholename "/home/demo/*/cache/*"ターゲットキャッシュディレクトリのサブディレクトリと一致するエントリを提供します。

次に、2番目のステートメントはindex.htmlファイルを生成します。

あなたの質問を正しく理解したら、このコマンドは次のように役立ちます。おそらくあなたが探しているものをしてください。ただし、使用する前に注意深く読んで、完全に理解していることを確認してください。

どのコマンドを実行する前に、コマンドの前にプレフィックスを付けることをお勧めしますrm。これにより、練習を行い、実行中の作業を確認できます。touchecho

はい(安全なテスト実行に使用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-pathfind

cdglobパターンのデフォルトディレクトリを計算する必要はないので、まず作業ツリーに移動する方がはるかに簡単です。

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と、無害なエラーが発生します。 )

関連情報