指定された文字列の前にあるファイルをアルファベット順に検索します


8

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

現在、bashを使用して実行できる最善の方法は次のとおりです。

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

   echo $x
done

これを行うにはもっと簡潔な方法があるように感じますが、それが何かはわかりません。何か案は?

回答:


4

それらすべてが必要な場合

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

最初が必要な場合

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

ありがとう!取得するため、この上のバリエーションのすべてのファイルとの間に与えられた変数は、次のようになりますawk '$0 >= "'"${FROM}"'" && $0 <= "'"${TILL}"'"'
Nickolay

3

sedそれはより簡潔です。

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

つまり、(ソート後に)参照行(またはそれ以上)と最後の行に続くすべての行を削除します。

ここでは、sed 'd'コマンドがアドレス範囲とともに使用されています。ここで、 '/ ^。/ reference /'は範囲の最初と '$'です。(そして、アドレスとしての「$」は最後の行を意味します。)



3

例えば。script-name "$HOME" "reference"...は、find常に出力をリードしていない./の場合のように、find binまたは、find /tmp。したがって、ファイルのベース名だけが必要な場合、これは機能します。

更新:tolower()が追加され、大文字と小文字を区別しない比較が可能になり、質問で言及されたアルファベット順の照合が生成されます...

#!/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にしてください。


これは機能していないようです。awkスクリプトの最後の部分をに変更しました$0 < refが、これは機能しますが、findの出力にスペースがないため、$ 2フィールドは存在しません。何か不足していますか?
マイクデッキ

おかげで、私は最後の瞬間にそれをすばやく変更し、そのフィールドを逃しました(元は2つの\ xFFで区切られたフィールドがありました)...今、少し眠っていたので、それはそうではないことがわかりますケースを適切に処理します。質問はアルファベット順の照合に言及しているため、大文字と小文字を区別しないことを意味します。答えを更新しました。
Peter.O 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.