番号付きディレクトリ内のファイルを検索する

番号付きディレクトリ内のファイルを検索する

下のディレクトリでは、深さ1(この場合は6〜11)の番号が付けられたディレクトリにネストされたファイルのリストが必要です。

$ ls *
1.org   2.MOV  3.MOV  4-1.MOV  5-1.mp4  5-2.MOV  5-2.org~  9-2.MOV
1.org~  2.org  3.org  4-1.org  5-1.org  5-2.org  9-1.MOV

10:
10.mp4

11:
11.MOV

6:
6.mp4

7:
7.MOV

8:
8.MOV

6.mp4たとえば、代わりに返したいと思います2.MOV。まず試してみてください(10 11が欠けているので完璧ではないことを知っています)。試してみましたが、depth場所の問題があります。

$ find . -type f -path [^0-9]/* 
./11/11.MOV
./5-1.mp4
./5-1.org
./4-1.MOV
./10/10.mp4
./7/7.MOV
./2.org
./3.org
./2.MOV
./5-2.org
./3.MOV
./5-2.org~
./5-2.MOV
./1.org
./1.org~
./8/8.MOV
./4-1.org
./9-2.MOV
./9-1.MOV
./6/6.mp4

答え1

find特に指定しない限り、現在のディレクトリに含まれているすべての項目が表示されるため、これらの結果が得られます。現在のディレクトリに6-11という番号が付けられたディレクトリのファイルのみを表示するには、次のものが必要です。

9がないので、次のものを使用できます。

find {6,7,8,10,11} -type f

これにより、埋め込まれた数だけが拡張されます。

6から11までの数字がすべてある場合:

find {6..11} -type f

これにより、6-11というディレクトリのファイルのみが検索され、返されます。

これが現在のディレクトリの唯一のディレクトリである場合(結果によると)、次のこともできます。

find . -mindepth 2 -type f

現在のディレクトリの下から1つまたは2つのレベルの下で開始するように指示します。

答え2

ls */

これにより、現在ディレクトリに隠されていないすべてのサブディレクトリの内容が一覧表示されます。数値名を持つサブディレクトリのみが存在するように見えるため、そのサブディレクトリの内容が表示されます。

シェルのグロービングパターンは、*現在のディレクトリに隠されていないすべての名前に展開されます。/パターンの末尾にを追加すると、パターンはディレクトリにのみ拡張されます(/ディレクトリ以外の名前は名前に含めることはできません)。

シェルを使用すると、zsh次のファイル名 globbing パターンが次に拡張されます。定期的な各サブディレクトリのファイル

*/*(.)

一致する名前に対していくつかの操作を実行するには、globパターンの拡張を繰り返すことができます。

for pathname in */*(.); do
    # use "$pathname" here
done

bashまたは、sh小さなスクリプトを呼び出すことができますfind

find . -mindepth 2 -maxdepth 2 -type f -exec sh '
    for pathname do
        # use "$pathname" here
    done' sh {} +

しかし、書く方法は少し珍しいです。

for pathname in */*; do
    [ ! -f "$pathname" ] && continue
    # use "$pathname" here
done

ただし、このfindバリアントには通常のファイルへのシンボリックリンクをスキップして隠し名前を含めます(これらの名前を含めるようにdotglobシェルオプションを設定します)。bash

繰り返しますが、これは必要に応じて(数字の名前でディレクトリを表示)実行されます。ただ数値名を持つサブディレクトリがあります。

別のサブディレクトリがある可能性があると仮定すると、

for pathname in */*; do
    [ ! -f "$pathname" ] && continue
    case $(dirname "$pathname") in
        *[!0-9]*) continue
    esac
    # use "$pathname" here
done

またはbash

for pathname in */*; do
    if [ ! -f "$pathname" ] ||
       [[ $(dirname "$pathname") == *[!0-9]* ]]
    then
        continue
    fi
    # use "$pathname" here
done

これらのループは、サブディレクトリのすべての名前を繰り返しますが、通常のファイル(またはファイルへのシンボリックリンク)を参照しないすべての名前をスキップし、名前に数字以外の内容を含むサブディレクトリ内のすべてのファイルもスキップします。

extglob次のシェルオプションを使用してbash短くすることができます。

shopt -s exglob
for pathname in +([0-9])/*
    [ ! -f "$pathname" ] && continue
    # use "$pathname" here
done

パターンは、+([0-9)/名前に数字のみを含むディレクトリ名に展開されます。オプションが代わりに設定されていてzshも機能します。KSH_GLOBextglob

GNUを使用すると、find明らかに数字ディレクトリを選択してその内容を繰り返すことができます。

find . -maxdepth 1 -type d -regex '.*/[0-9]+$' -exec sh '
    for dirpath do
        for pathname in "$dirpath"/*; do
            [ ! -f "$pathname" ] && continue
            # use "$pathname" here
        done
    done' sh +

ただし、通常、ファイル名またはディレクトリ名に正規表現を使用することはお勧めできません。正規表現は、主にテキストファイル内のテキストを一致させるために使用されるためです。findGNUソフトウェアは可能な限り便利になるため、GNUは正規表現とパス名の一致をサポートしているようです。

関連情報