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

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

すべてのファイル名をに変更しようとしていますChownFileNames。このコマンドを使用しましたが、うまくいかないようです。

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

私は何が間違っていましたか?

答え1

chown hadoop:hadoop ChownFileNames*

答え2

これはあなたの要件に合うべきです。

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

答え3

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

findファイル名自体を一致させる方法がありますが、これが-name述語です。引数としてシェルワイルドカードパターンを使用します。

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

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

find使用されるムーブメントははるかに簡単で頑丈です-exec-exec … {} +ファイルごとに一度ではなく、一度にファイルの配置に対してこのコマンドを実行できます。find現在のディレクトリを一覧表示することもできます。

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

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

chown hadoop:hadoop . ChownFileNames*

答え4

-nameまたは-inameでオプションを確認してください。find(1)

関連情報