数百万のファイルとディレクトリを含むディレクトリ /some/dir があります。ディレクトリからではなく、すべてのファイルの X ビットを削除する必要があります。
以下の作品:
find /some/dir -type f -chmod -x {} \;
しかし、ファイルごとに「chmod」プロセスが生成されると思います。これが、長時間実行される理由かもしれません。
これをもっと効率的に行う方法はありますか?
答え1
さらにxargs
、Ljm Dullaart が言及していたように、次のものも使用できます。
find /some/dir -type f -exec chmod -x {} +
デバッグのトリックとして、生成されたコマンドを次のように確認できます。
find /some/dir -type f -exec echo chmod -x {} +
のマニュアルページより見つける(1)指示:
-exec command {} +
この-exec
アクションの変形は、選択されたファイルに対して指定されたコマンドを実行しますが、コマンドラインは、選択された各ファイル名を末尾に追加することによって構築されます。コマンドの呼び出しの合計数は、一致したファイルの数よりもずっと少なくなります。コマンドラインは、xargs がコマンドラインを構築するのとほぼ同じ方法で構築されます。{}
コマンド内では のインスタンスが 1 つだけ許可され、 の直前の末尾に表示する必要があります+
。シェルによる解釈から保護するには、エスケープ ( を使用\
) するか引用符で囲む必要があります。コマンドは開始ディレクトリで実行されます。+
形式の呼び出しが終了ステータスとしてゼロ以外の値を返す場合、find はゼロ以外の終了ステータスを返します。find がエラーに遭遇すると、これによって即時終了が発生する場合があり、保留中のコマンドがまったく実行されないことがあります。このため、-exec my-command ... {} + -quit
my-command が実際に実行されないことがあります。 のこの変形は-exec
常に true を返します。
答え2
xargs
スポーンを制限するために使用します:
find /path/to/base/dir -type f -print0 | xargs -0 chmod -x