unix – chown を再帰的に動作させるには?

permissions unix

私はpdfsと呼ばれるディレクトリを持っていますが、その中にはサブおよびサブディレクトリの束が含まれています。そのサブフォルダ内のすべてのPDFファイルの所有権を変更したい。これを試してみました

chown -R someuser:somegroup *.pdf

…でも、サブディレクトリ内のPDFの所有権は変わりませんでした。ユーザーとグループは存在しています

chownのマニュアルページによると、-Rは再帰的な意味を持つはずです

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

何が足りないの?

  336  Nathan Long  2011-03-22


ベストアンサー

再帰モードはファイルではなくディレクトリに対してのみ動作します。glob ‘*.pdf’ を使うことで、シェルはファイルリストを chown に渡しています

シェルでは、グロブはコマンドではなくシェルによって評価されることを覚えておいてください。グロブがファイルにマッチする場合、ファイルはコマンドに渡され、コマンドはグロブの存在を知りません (これは、Windows コマンド・プロンプトが行っていた方法とは異なります)。(これは、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フラグを無視して、あなたが要求したことを実行します

このディレクトリとサブディレクトリのパターンとして ‘*.pdf’ を使うには、find を使うことができます

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

これは現在のディレクトリ ‘.’ から始まり、名前のパターン '*.pdf' のファイル (filetype f) を探して xargs に渡し、chmod するコマンドラインを構築します。シェルは可能であればグロブを作成しますが、パターンを find に渡したいので、引用符で囲む必要があることを覚えておいてください

ファイル名にスペースが入っている場合があるので、スペース付きのファイル名を安全にするためのトリックを使いたいところです

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

bash 3 以下では、このようにする必要があります。より強力なグロブ処理は bash 4 (shopt -s globstar を使って) や他のシェルで利用できます。再帰的グロブ ** を使った zsh でも同様です

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

349  Rich Homolka  2011-03-22


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

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

70  Sprachprofi  2015-11-09


findユーティリティを使用することができます

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

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

15  bmk  2011-03-22


The command

chown -R someuser:somegroup *.pdf

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

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

6  Mike Scott  2011-03-22


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

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

ここでは username = ディレクトリのオーナーとなる新しいユーザを指定します

groupname = ディレクトリのオーナーとなる新しいグループ

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

1  KawaiKx  2016-05-11


代わりにtreeを使っています

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

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

0  Eduard Florinescu  2018-01-25


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

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

instead of

sudo chown $USER directory\*

or

sudo chown --recursive $USER directory

で生成される引数が多すぎる(ディレクトリ内のファイルが多すぎる)場合や、それぞれの目的を達成できない場合に動作しない可能性があります

0  masterxilo  2019-01-29


タイトルとURLをコピーしました