ファイル名がChownFileNames
で始まるすべてのファイルをchownしようとしています。このコマンドを使用しましたが、機能しないようです。
find . -maxdepth 1 |grep 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;
私は何が間違っているのですか?
chown hadoop:hadoop ChownFileNames*
これはあなたが必要とするもののために働くはずです:
find . -maxdepth 1 -iname 'ChownFileNames*' -exec chown hadoop:hadoop -- {} . \;
|
(「パイプ」)記号は、左側のコマンドの出力を右側のコマンドに渡すことを意味します。コマンド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
オプションをご覧ください。