すべてのファイル名をに変更しようとしています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 -- {} . \;
意味がありません。コマンド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 … {} +
ファイルごとに一度ではなく、一度にファイルの配置に対してこのコマンドを実行できます。find
現在のディレクトリを一覧表示することもできます。
find . maxdepth 1 \( -name . -o -name 'ChownFileNames*' \) -exec chown hadoop:hadoop {} +
find
通常、サブディレクトリを参照せずに現在のディレクトリの名前(日付ではないなど)でファイルを照合するときに実行することは意味がありません。現在のディレクトリにファイルが多すぎてコマンドラインが長すぎない場合は、次のように使用してください。
chown hadoop:hadoop . ChownFileNames*
答え4
-name
または-iname
でオプションを確認してください。find(1)