目標はfind
*.c ファイル保留中dos2unix
:
find . -name *.c | xargs dos2unix -f
上記のコマンドの問題を解決してください。
user@host:~/csim/exercise$ find . -name *.c
./6-1/dinph_3p.c
./6-1/dinph_pi.c
./9-2/lift.c
./6-4/cmptr.c
./8-7/station.c
./7-4/hire.c
./5-2/ran_test.c
./8-4/cmptrm.c
./9-5/trunked.c
./8-5/computer.c
./9-3/aloha.c
./12-3/mcpu.c
./10-5/abp_pi.c
./6-2/dinph_3p.c
./6-2/dinph_pi.c
BASHがディレクトリの1つ上のレベルに移動したときにこれが起こるのはなぜですか?
$ cd ..
同じコマンドが少なくとも上記の.cファイルを返しませんか?
user@host:~/csim$ find . -name *.c
find: paths must precede expression: random.c
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec|time] [path...] [expression]
答え1
ワイルドカード文字(例*.c
:)を検索するときは、単一引用符で囲む必要があります。ディレクトリを上に移動すると、入力したディレクトリに終わるファイルが複数あることが予想されます。.c
その一つはrandom.c
。*.c
ディレクトリに次のものが含まれているとしますhi.c
。random.c
find . -name *.c
になる:
find . -name hi.c random.c
一重引用符で囲むと、*.c
シェルは拡張されません。
以下の各ファイルを見つけて処理するには.c
:~/csim
dos2unix
find ~/csim -type f -name '*.c' | xargs dos2unix -f
答え2
@Andyの内容にさらに説明を追加します。
デフォルトfind
では、コマンドにはoptionsの引数(プレースホルダ)としてファイル名またはパターンが必要です-name
。
echo *.c
1つ以上のファイルを含むディレクトリで実行しようとすると、.c
結果はそのファイルのスペースで区切られた名前になります。
$echo *.c
abc.c bcd.c
.c
ディレクトリにファイルがない場合、結果は次のようになります。
$echo *.c
*.c
同様に、2つ以上のファイルを含むディレクトリでは、find . -name *.c
inはディレクトリ内のすべてのファイルの名前に置き換えられます(* .cはオプションの複数の引数に拡張されます)。そうです。ここで find の成功後に検索を開始すると、1 つのパラメータしか許可されないため、エラーが発生します。 (パラメータが1つしかない場合は結果に書き込まれ、サブディレクトリからは検索されません。).c
*.c
find
.c
-name
find . -name abc.c bcd.c
bcd.c
abc.c
-name
.c
.c
ただし、ディレクトリにファイルがない場合、*
inの実際の意味は*.c
そのまま残ります。
したがって、すべての検索を~/csim/exercise
使用しようとすると、コマンドが実行されるディレクトリにファイルがないfind
ようです。*.c
これがinのワイルドカードの意味を維持し、サブディレクトリで検索が成功する理由です。それ以降は、ファイルが2つ以上であると疑われ、検索に失敗しました。*.c
find
*
*.c
cd ..
~/csim/
*.c
解決策はより簡単です。ワイルドカードをエスケープするだけで十分です。次のいずれかを使用します。
find . -name '*.c'
or
find . -name \*.c
or
find . -name "*.c"