web-dev-qa-db-ja.com

どうやってchownを再帰的に動かすことができますか?

私はpdfsという名前のディレクトリを持っていて、そこにはたくさんのサブディレクトリとサブサブディレクトリがあります。すべてのサブフォルダー内のすべてのPDFファイルの所有権を変更したいです。私はちょうどこれを試しました:

chown -R someuser:somegroup *.pdf

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

chownのmanページによると、-Rは再帰的を意味します。

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

何が足りないの?

272
Nathan Long

再帰モードはディレクトリでのみ機能し、ファイルでは機能しません。 glob '* .pdf'を使用することによって、シェルはファイルリストを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が機能するディレクトリはありません。コマンドラインで2つのファイルの所有権を変更しますが、その変わった-Rフラグは無視されます。

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

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

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

ファイル名にはスペースが含まれる可能性があるため、filename-with-spacesの安全性を高めるためのトリックを使用します。

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

Bash 3以下では、これがあなたがそれをする必要がある方法です。 bash 4(shopt -s globstarを含む)および他のシェルでは、より強力なglobbingが利用可能です。 zshでも同じで、再帰的グロブ**を使用します。

chown -R someuser:somegroup ./**/*.pdf
279
Rich Homolka
chown -R someuser:somegroup /your/folder/here/*

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

47
Sprachprofi

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

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

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

14
bmk

コマンド

chown -R someuser:somegroup *.pdf

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

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

代わりにtreeを使用します。

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

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

0

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

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

ここでusername =ディレクトリの所有者になるべき新しいユーザー

groupname =ディレクトリの所有者となるべき新しいグループ

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

0
KawaiKx

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

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

の代わりに

Sudo chown $USER directory\*

または

Sudo chown --recursive $USER directory

*によって生成される引数が多すぎる(ディレクトリ内のファイルが多すぎる)場合、またはそれぞれが望んだとおりに動作しない場合は、うまくいかない可能性があります。

0
masterxilo