ディレクトリを繰り返すには、「検索」を使用します。 -深さ1 -タイプd `

ディレクトリを繰り返すには、「検索」を使用します。 -深さ1 -タイプd `

実行するスクリプトがありますが、呼び出すと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

このコマンドはfindFreeBSDバージョン(または同様のバージョン)用に書かれており、サポートされていない他のバージョンを使用しています。エラーメッセージによると、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 ...)ファイル名にスペースが含まれていると問題が発生する可能性があるため、使用しないでください。

望むより:

(*テキストが示すように、-depth事前/事後注文の移行ではこの名前は正しくありません。)

関連情報