web-dev-qa-db-ja.com

現在のディレクトリ内のファイル名パターンに基づいてすべてのファイルをchownします

ファイル名がChownFileNamesで始まるすべてのファイルをchownしようとしています。このコマンドを使用しましたが、機能しないようです。

find . -maxdepth 1 |grep 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;

私は何が間違っているのですか?

6
van
chown hadoop:hadoop ChownFileNames*
7
Ulrich Dangel

これはあなたが必要とするもののために働くはずです:

find . -maxdepth 1 -iname 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;
5
fromnaboo

|(「パイプ」)記号は、左側のコマンドの出力を右側のコマンドに渡すことを意味します。コマンドfind . -maxdepth 1は、現在のディレクトリ内のファイル(および.自体)を一覧表示します。コマンドgrep 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;は意味がありません。findオプションをgrepコマンドに渡しています。

find自体には、ファイル名、-name述語を照合する方法があります。引数としてシェルワイルドカードパターンを取ります。

grepを使用してリストをフィルタリングすることもできますが、grepに有効なコマンドラインを指定する必要があります。シェルパターンChownFileNames*に一致するファイル名のみを保持するには、正規表現/ChownFileNames[^/]$を使用する必要があります。次に、grepの出力を解析して、一致する名前のリストをコマンドライン引数に変換する必要があります。 Linuxを実行していて、ファイル名に改行が含まれていないとすると、xargsを使用できます。

find . -maxdepth 1 |
grep '/ChownFileNames[^/]*$' |
xargs -d '\n' chown hadoop:hadoop

find-execアクションを使用する方がはるかに簡単で堅牢です。 -exec … {} +を使用して、ファイルごとに1回ではなく、ファイルのバッチに対してコマンドを一度に実行できることに注意してください。 findに現在のディレクトリをリストさせることもできます。

find . maxdepth 1 \( -name . -o -name 'ChownFileNames*' \) -exec chown hadoop:hadoop {} +

現在のディレクトリ内のファイルを名前だけで(日付などではなく)照合する場合(サブディレクトリをトラバースせずに)、通常はfindを実行しても意味がありません。現在のディレクトリにファイルが多すぎてコマンドラインが長くなりすぎない限り、次を使用してください。

chown hadoop:hadoop . ChownFileNames*

find(1)-nameまたは-inameオプションをご覧ください。

0
Igor Galić