Linuxシェル:find -execで-execを探す

Linuxシェル:find -execで-execを探す

取得したすべてのファイルとディレクトリに対して次のコマンドを実行したいと思いますchmod 555(testディレクトリとその中のすべてのファイルとディレクトリを返します)。

find ~/.config/google-chrome -type d -name test -exec find {} \;

答え1

この場合、chmod -R次のことができます。user26112の返信しかし、通常は次のようにすることができます。

find ~/.config/google-chrome -type d -name test -exec sh -c '
  for i do
    find "$i" -exec chmod 555 {\} +
  done' sh {} +

秘密は、シェルを使用し、引用符({\}または{"}")を使用して内部が{}外部に拡張されないようにすることですfind(引数の一部であっても、findその実装はまだ拡張されていることを考慮してください)。{}

GNU find4.9.0以降では、stdinでNUL区切りレコードとして処理されるファイルのリストのインポートもサポートされているため、次のことができます。

find -files0-from <(
    find ~/.config/google-chrome -type d -name test -print0
  ) -exec chmod 555 {} +

以前のバージョンでは、GNUを使用して同様の操作を実行し、xargsパラメータshの順序を変更できます。

xargs -r0a <(
    find ~/.config/google-chrome -type d -name test -print0
  ) sh -c 'exec find "$@" -exec chmod 555 {} +' sh

<(...)はいプロセスの交換、zsh、bashもksh機能をサポートしているので、yash's'と混同しないでください。プロセスリダイレクト)。

答え2

chmodフラグを使用して、-Rディレクトリとその下の階層内のすべてのファイルとディレクトリの権限を変更できます。

find ~/.config/google-chrome -type d -name test -exec chmod -R 555 '{}' \;

答え3

本当に両方をしたい場合は、find -exec次のことを試してください。

find /etc -type f -exec sh -c 'find "$0" -exec echo {\} \;' {} \;

(これは見つかった内容をechoコマンドに渡します)find

find /etc -type d -exec sh -c 'find "$0" -type f -exec echo "$0" {\} \;' {} \;

(有用な例:ディレクトリ名とその中にあるファイルリストを印刷)

以下を使用して、句のパイプの問題をsh -c解決することもできます。find -execsh -c$0$1

答え4

このコマンドを実行することもできます。すべてのディレクトリで実行されますが、引数として渡された複数の「テスト」ディレクトリを実行するという引数を+使用します。findchmod

$ find ~/.config/google-chrome -type d -name test -exec chmod -R 555 '{}' +

関連情報