私はpdfs
という名前のディレクトリを持っていて、そこにはたくさんのサブディレクトリとサブサブディレクトリがあります。すべてのサブフォルダー内のすべてのPDFファイルの所有権を変更したいです。私はちょうどこれを試しました:
chown -R someuser:somegroup *.pdf
...しかし、サブディレクトリ内のPDFの所有権は変わりませんでした。ユーザーとグループは存在します。
chown
のmanページによると、-R
は再帰的を意味します。
-R, --recursive
operate on files and directories recursively
何が足りないの?
再帰モードはディレクトリでのみ機能し、ファイルでは機能しません。 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
chown -R someuser:somegroup /your/folder/here/*
これは、指定したフォルダのすべてのファイルとすべてのサブディレクトリおよびサブサブディレクトリにchownを適用します。慎重に使用してください。
find
ユーティリティを使用できます。
find . -name '*.pdf' -exec chown someuser:somegroup {} +
*.pdf
を囲む引用符を忘れないでください。それ以外の場合、シェルはそれを拡張しようとします。つまり、シェルはすでに*.pdf
を現在のディレクトリにあるすべてのPDFファイルの名前に置き換えます。しかし、それはあなたが望むものではありません。サブディレクトリにあるPDFファイルを見つけます。ところで:それはまたあなたのchown
コマンドの問題です。
コマンド
chown -R someuser:somegroup *.pdf
ディレクトリの名前が.pdfで終わる場合にのみ、ディレクトリを下に再帰します。次のようなものが必要です。
find . -name "*.pdf" -exec chown someuser:somegroup {} \;
代わりにtree
を使用します。
Sudo tree -fai ~/.blabla | xargs -L1 -I{} Sudo chown youruser:youruser {}
また、 '/'ディレクトリや他のシステムディレクトリで再帰的なchownやchmodを実行しないように注意してください。
ディレクトリの所有権を再帰的に変更するには、単純に次のようにします。
Sudo chown -R <username>:<groupname> <dir name>
ここでusername =ディレクトリの所有者になるべき新しいユーザー
groupname =ディレクトリの所有者となるべき新しいグループ
すべてのファイル/ディレクトリにはユーザー所有者とグループ所有者がいます
ディレクトリ内のすべてのファイルの所有者になるには、次のようにします。
find directory -type f -name '*' | Sudo xargs -d '\n' chown $USER
の代わりに
Sudo chown $USER directory\*
または
Sudo chown --recursive $USER directory
*によって生成される引数が多すぎる(ディレクトリ内のファイルが多すぎる)場合、またはそれぞれが望んだとおりに動作しない場合は、うまくいかない可能性があります。