web-dev-qa-db-ja.com

ディレクトリの内容をchownする最も簡単な方法は?

よく使う

ls -ld .
# remember current user and group
chown -R user.group .
chown remembered_user.remembered_group .

ディレクトリ内のすべてのファイルとディレクトリを再帰的にchownするが、ディレクトリ自体はchownしない簡単な方法はありませんか?隠しファイルを含み、ファイルの数に関係なく機能する必要があります。

3
AndreKR

findを使用すると、引数リストが長くなりすぎないようにしながら、一度にできるだけ多くの引数をchownに渡すことができます(+の代わりに;を使用します)。 )。 -Pruneを使用すると、chownへの不要な引数を削除できます(ディレクトリを下降せず、chown -Rを使用するだけです):

find . \! -iname . -Prune -exec chown -R user:group {} +
4
Chris Down

以下を使用できます。

find . -mindepth 1 -print0 | xargs -0 chown user:group

編集:上記の例の問題は、現在のフォルダー(。)を操作していることです。私の例のmindepthセクションは、変更されるファイル/ディレクトリのリストから現在のフォルダを除外します。

Print0は、検索出力をnullで終了するように変更し、xargsは各行(または、-0のnullで終了する文字列)で動作し、最後に入力(この場合は各ファイル名)を指定して指定されたコマンドを実行します。次のように、xargsコマンドをより明示的に変更できます。

xargs -0I {} chown user:group {}

そうすれば、findの出力をコマンドの好きな場所に置くことができます。

1
jkt123

ディレクトリ内でchownを再帰的に実行してみませんか。

_$ chown -R user.group *
_

以前の_._ディレクトリ。

_$ ll
total 20
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir1
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir2
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir3
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir4
drwxrwxr-x. 2 saml saml 4096 Apr  9 22:30 dir5
_

Dirの内容だけを変更します。

_$ chown -R saml.wheel *
_

後の内容。

_$ ll
total 20
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir1
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir2
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir3
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir4
drwxrwxr-x. 2 saml wheel 4096 Apr  9 22:30 dir5
_

その間、ディレクトリ_._はそのまま残ります。

_$ ls -ld .
drwxrwxr-x. 7 saml saml 4096 Apr  9 22:29 .
_

隠しファイルがある場合は、それらをglobに含めるようにシェルを設定してください:bashでは_shopt -s dotglob_、ksh93ではFIGNORE='@(.|..)'、zshでは_setopt dot_glob_。

または、それらに一致するパターンを追加します(zsh以外のシェルでは、_.*_は_._および_.._に一致することに注意してください)。

_chown -R saml.wheel * .[!.]* ..?*
_

またはzshでは、単に

_chown -R saml.wheel *(D)
_
1
slm

Zshの場合:

chown user:group **/*(D)

glob qualifierDは、ドットファイルが一致することを意味します。

シェルの代わりにchownに再帰的トラバーサルを実行させることができます。

chown -R user:group *(D)

ファイルが多すぎてコマンドラインが長くなりすぎることが心配な場合は、 zsh/filesモジュール から chownbuiltin をロードしてください。

zmodload zsh/files
chown user:group **/*(D)

chownにビルトインを参照させたくない場合は、zf_*名のみをロードできます。

zmodload -Fm zsh/files b:zf_\*
zf_chown user:group **/*(D)

コマンドラインの制限に収まらない可能性のあるファイルの長いリストで外部コマンドを呼び出す必要がある場合(ここではそうではありません)、 zargs を使用できます。関数:

autoload -U zargs
zargs -- **/*(D) -- chown user:group --

最初のディレクトリに多くのファイルがある場合でも、ChrisDownの回答は失敗する可能性があります。

find . \! -iname . -exec chown user:group {} \;

ほとんどの場合、クリスダウンの答えはおそらく失敗せず、おそらくこの答えよりも速いでしょうが、私はあなたが尋ねたとおりにあなたの質問に答えたかったのです。

また、これは私の場合にうまく機能したわずかに異なるコマンドです。スクリプト内のディレクトリを変更するのは好きではないので、代わりに次のようなコマンドを作成しました。

find /foo/bar/baz \! -samefile /foo/bar/baz -exec chown user:group {} \;
0
Jackson