
コンテキスト以外(「私が望むアクション」を説明するために比較):データベースを照会するときはいつid> 5とid < 99を選択できますか?
CONTEXT-part1:多数のファイルを含むディレクトリにあります。
CONTEXT-part2:123.txt 145.txt 233.txt 678.txtに似たファイル名(順序ではありません)
私がやりたいこと:127より大きく300より小さいファイル(ファイル名)を探す
例:「part2」に145.txt 233.txtがあります。
私が試み始めたもの:find . -regextype sed -regex '.*/[1-9].ref'
しかし、どうすればもっとうまくいくのでしょうか?
答え1
zsh
シェルを使用すると、ワイルドカードパターンは127から300の数字で始まり、文字列で終わるディレクトリのすべての名前part2/<128-299>.txt
と一致します。part2
.txt
例:
$ tree
.
|-- part1
| |-- 123.txt
| |-- 145.txt
| |-- 233.txt
| `-- 678.txt
`-- part2
|-- 123.txt
|-- 145.txt
|-- 233.txt
`-- 678.txt
2 directories, 8 files
$ printf '%s\n' part2/<128-299>.txt
part2/145.txt
part2/233.txt
このようなシェルでは、bash
次のパターンセットが同じことを行います。
part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
前提は、nullglob
シェルオプションが設定されているということです、または拡張されていないパターンを取得できます。
$ printf '%s\n' part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
part2/12[89].txt
part2/145.txt
part2/233.txt
$ shopt -s nullglob
$ printf '%s\n' part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
part2/145.txt
part2/233.txt
nullglob
たとえば、なしのシェルでは、sh
生成された各文字列の存在をテストするためにループを使用する必要があります。
for name in part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
do
[ -e "$name" ] && printf '%s\n' "$name"
done
の場合、find
シェル以外の場合と同じ種類のパターンを使用しますzsh
。
find part2 -name '12[89].txt' -o -name '1[3-9][0-9].txt' -o -name '2[0-9][0-9].txt'
しかし、zsh
ここでも明らかに使用できます。
find part2 -exec zsh -c '[[ $1:t == <128-299>.txt ]]' zsh {} \; -print
これは、見つかった各パス名に対してインラインzsh
スクリプトを呼び出し、この回答の先頭にあるものと同様のパターンを使用してファイル名を比較します。
find
明らかに、下のサブディレクトリでも繰り返されますpart2
。