与えられた文字列の前にあるファイルをアルファベット順に探します。

与えられた文字列の前にあるファイルをアルファベット順に探します。

ファイルとサブディレクトリがいっぱいのディレクトリがある場合。与えられた文字列の前にアルファベット順に来る一般的なファイルだけをリストする最良の方法は何ですか?

現在bashでできる最善の方法は次のとおりです。

for x in `find . -maxdepth 1 -type f | sort`
do
   if [[ "$x" > './reference' ]]
   then
      break
   fi

   echo $x
done

これを行うためのよりきれいな方法があるようですが、それが何であるかわかりません。どんなアイデアがありますか?

答え1

すべてが必要な場合

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"'

まず必要な方

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"{print;exit}'

答え2

sedはるかに簡単です。

$ find -maxdepth 1 -type f | sort | sed '/^\.\/reference/,$d'

これは、ソート後の参照行(またはより大きな参照行)と最後の行の後のすべての行を削除することを意味します。

ここでは、sed 'd'コマンドがアドレス範囲と共に使用されます。ここで '/^./reference/' は範囲の始まりであり、 '$' は範囲の終わりです。 (アドレスの「$」は最後の行を意味します。)

答え3

必須 zsh 回答、使用. グローバル予選一般ファイルのみを選択し、e一致の中からさらに選択します。

echo *(.e\''[[ $REPLY > reference ]]'\')

答え4

例えば。script-name "$HOME" "reference"... find、またはの場合のように、常に先行を出力するわけではありません./。したがって、ファイルの基本名だけが必要な場合はこれが機能します。 find binfind /tmp

修正する:次へ追加減らす()大文字と小文字を区別しない比較を許可します。アルファベット順に質問に記載されている並べ替え...

#!/bin/bash
dir="$1"; ref="$2"
find "$dir" -maxdepth 1 -type f -printf "%f\n" | awk -v"ref=$ref" 'tolower($0) < tolower(ref)'

ソートする必要がある場合は、sortafterにパイプするだけです。awk

関連情報