名前に数字を含むファイルを含むディレクトリ内のxより大きいまたは小さいファイルを見つける方法

名前に数字を含むファイルを含むディレクトリ内のxより大きいまたは小さいファイルを見つける方法

コンテキスト以外(「私が望むアクション」を説明するために比較):データベースを照会するときはいつ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

おすすめ記事