実行するスクリプトがありますが、呼び出すとfind . -depth 1 -type d
次のエラーが発生します。
find: paths must precede expression: `1'
これは失敗した行です。
for dir in `find . -depth 1 -type d`
do
....
成功していないままたくさん試してみました。少なくとも私にとっては、パスが「1」の前にあるので、エラーが発生する理由を実際に理解していません。
答え1
ただし、この-depth
スイッチはパラメータを使用しないため、-maxdepth does
次のようになります。
for dir in `find . -depth -maxdepth 1 -type d`
do
....
動作する必要があります。
-depth
マニュアルページのパラメータは、ディレクトリの内容が最初に処理されることを意味します。
答え2
このコマンドはfind
FreeBSDバージョン(または同様のバージョン)用に書かれており、サポートされていない他のバージョンを使用しています。エラーメッセージによると、GNUかもしれません。 FreeBSDバージョンには2つのオプションがあります(-depth n
-depth
マニュアルページ):
-深さは
常に真です。移植不可能な-dオプションと同じです。 findに深さ優先巡回を実行させます。つまり、ディレクトリを最後の順序で訪問し、ディレクトリ内のすべてのエントリがディレクトリ自体の前に実行されます。デフォルトでは、findはディレクトリに順番に、つまりコンテンツの前にアクセスします。デフォルト値は幅優先巡回ではありません。-lengthn
ファイルがナビゲーションの開始点に基づいて深さnにある場合はtrueです。
最初は標準(*)、2番目は標準ではありません。標準は引数を取らずに find 式内または後ろに別々の引数 (パス) を提供できないため (ご覧のように) FreeBSD バージョンはある程度名前を上書きすることを避けることができます。 (引数を忘れると-depth
意味が変わるため、まだエラーが発生しやすいです。)
GNUとBusyboxには、特定の深さが必要なときに使用できるのと同じ非標準機能があります。-mindepth n
-maxdepth n
find . -mindepth 1 -maxdepth 1 -type d
for f in $(find ...)
ファイル名にスペースが含まれていると問題が発生する可能性があるため、使用しないでください。
望むより:
- バッシュトラップmywiki.wooledge.orgから
- スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?
(*テキストが示すように、-depth
事前/事後注文の移行ではこの名前は正しくありません。)