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