chownを再帰的に機能させるにはどうすればよいですか?


285

という pdfsサブディレクトリとサブサブディレクトリの束を含むディレクトリがあります。すべてのサブフォルダーのすべてのPDFファイルの所有権を変更したい。私はこれを試しました:

chown -R someuser:somegroup *.pdf

...しかし、サブディレクトリ内のPDFの所有権は変更されませんでした。ユーザーとグループは存在します。

のmanページによると、再帰を意味chownする-Rはずです:

-R, --recursive
          operate on files and directories recursively

私は何が欠けていますか?

回答:


292

再帰モードは、ファイルではなくディレクトリでのみ機能します。glob '* .pdf'を使用することにより、シェルはファイルリストをchownに渡します。chownはこれらがファイルであることを確認し、表示されるファイルの権限を変更します。

シェルでは、globはコマンドではなくシェルによって評価されることに注意してください。グロブがファイルと一致する場合、それらはコマンドに渡され、コマンドはグロブが存在することを決して知りません。(これは、Windowsコマンドプロンプトを使用した方法とは異なります)。dirがある場合、内容は次のようになります。

machine:$ ls -F
file1.pdf  file2.pdf  other.txt  subdir/

そして、あなたはタイプしました:

chown -R someuser:somegroup *.pdf

シェルは最初にリストを作成します:file1.pdf file2.pdf

そして、コマンドを実行します:

chown -R someuser:somegroup file1.pdf file2.pdf

参照してください、-Rが動作するディレクトリはありません。それはあなたがそれをしたことをします-その風変わりな-Rフラグを無視して、コマンドラインで2つのファイルの所有権を変更します。

このディレクトリとサブディレクトリのパターンとして '* .pdf'を使用するにfindは、ファイル名パターン(または他の多くのcriterea)に一致するファイルを検索してサブコマンドに渡すことができるを使用できます。

find . -type f -name '*.pdf' | xargs chown someuser:somegroup

これは現在のディレクトリ「。」で始まります。名前パターンのファイル(ファイルタイプf)を探し、'*.pdf'xargsに渡します。xargsは、chmodのコマンドラインを作成します。patternを囲む引用符に注意して'*.pdf'ください。可能な場合、シェルはglobを作成しますが、パターンをに渡すfind必要があるため、引用符で囲む必要があります。

ファイル名にはスペースが含まれている可能性があるため、スペースを含むファイル名を安全にするためのトリックを使用する必要があります。

find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup

bash 3以前では、これが必要な方法です。より強力なグロビングは、bash 4(with shopt -s globstar)およびその他のシェルで使用できます。再帰的なglobを使用したzshでも同じです**

chown -R someuser:somegroup ./**/*.pdf

1
bash 4 shopt -s globstarが再帰的なグロビングを行うことを反映するように編集されました。
小次郎

@kojiroありがとう!あなたが言うことができるように、私はまだbash3を使用しています
リッチ・ホモルカ

2
元のポスターに示されているmanページによれば、chown -Rが実際にフォルダーとファイルの所有者を変更したことがわかりました。検索する必要はありません。ミント15を使用します。
gwideman13年

@gwideman私はこれが古いことを知っています...しかし、はい、もちろん-Rは再帰的です。OPは、単に「ファイルの種類がファイルされ、」1つのフィルタリング再帰の非常に特定の種類、拡張子との問題を持っていた
リッチHomolka

@RichHomolkaああ。OPは、ファイルは「pdfs」というディレクトリにあると言ったので、問題は再帰するディレクトリとしてpdfsを指定する方法にあり、含まれているファイルはすべてpdfであるため、それらを具体的に選択する必要はないと考えました。しかし、pdfファイルのみを選択し、他のファイルを変更しない場合は、あなたは正しいかもしれません。
-gwideman

52
chown -R someuser:somegroup /your/folder/here/*

これにより、指定したフォルダーのすべてのファイルとすべてのサブディレクトリとサブサブディレクトリにchownが適用されます。注意して使用してください。


2
どういうわけかsudo chown -R user ./私のために働いたが、そうでsudo chown -R user ./*はなかった
スラブ

1
私はこれが古いことを知っていますが、これは見出しに答えますが、質問には答えません。これは、実際にOPがすでに試行したものよりもわずかに悪いです。
リッチHomolka

2
@RichHomolka質問のタイトルのためだけにここに来て、私はこの答えを見つけてとてもうれしいです。
フェリックスガニヨングレニエ

@FélixGagnon-Grenierまあまあ。この答えがあなたのために働くなら、私はとても幸せです。しかし、元の質問ではうまくいきませんでした。
リッチホモルカ

これは、などのドットファイルでは機能しないよう.envです。
ライアン

14

findユーティリティを使用できます:

find . -name '*.pdf' -exec chown someuser:somegroup {} +

引用符を忘れないでください*.pdf。そうでない場合、シェルはそれを展開しようとします。これは*.pdf、現在のディレクトリにあるすべてのPDFファイルの名前ですでにシェルが置き換えられることを意味します。しかし、それはあなたが望むものではありません。サブディレクトリにあるPDFファイルを見つけたい。Btw .:それもあなたのchownコマンドの問題です。


1
+パフォーマンスのために、きちんとしたトリックを調べる必要がありました。-exec command {} +この-execアクションのバリアントは、選択されたファイルに対して指定されたコマンドを実行しますが、コマンドラインは、選択された各ファイル名を最後に追加することによって構築されます。コマンドの呼び出しの総数は、一致するファイルの数よりもはるかに少なくなります。コマンドラインはxargs、コマンドラインを作成するのとほぼ同じ方法で作成されます。{}コマンド内では1つのインスタンスのみが許可されます。コマンドは開始ディレクトリで実行されます。
パトリックM

@PatrickM +(+ vs)のもう1つの利点(マイナー)。....プラスシェルのメタ文字ではなく、エスケープする必要はありません
リッチHomolka

6

コマンド

chown -R someuser:somegroup *.pdf

ディレクトリ名が.pdfで終わる場合にのみ、ディレクトリを再帰的に再帰します。次のようなものが必要です。

find . -name "*.pdf" -exec chown someuser:somegroup {} \;

技術的には1レベル下にのみ移動します。その真の再帰を呼び出すかどうかは、ユーザーの練習です:)
リッチHomolka

1

ディレクトリの所有権を再帰的に変更するには、次を使用します。

sudo chown -R <username>:<groupname> <dir name>

ここで、username =ディレクトリの所有者である新しいユーザー

groupname =ディレクトリの所有者でなければならない新しいグループ

すべてのファイル/ディレクトリにはユーザー所有者とグループ所有者がいます


これは、OPが要求したことを行いません。これにより、すべての所有権が変更され、OPは特定のファイルセットを要求しました。
リッチホモルカ

0

tree代わりに使用します:

 sudo tree -fai ~/.blabla  | xargs -L1 -I{} sudo chown youruser:youruser {}

また、 '/'ディレクトリまたは他のシステムディレクトリで再帰的なchownまたはchmodを実行しないように注意してください。


0

ディレクトリ内のすべてのファイルの所有者になるには、次を使用します

find directory -type f -name '*' | sudo xargs -d '\n' chown $USER

の代わりに

sudo chown $USER directory\*

または

sudo chown --recursive $USER directory

*(ディレクトリ内のファイルが多すぎる)によって生成された引数が多すぎる場合は機能しない可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.