ファイルとサブディレクトリがいっぱいのディレクトリがある場合。与えられた文字列の前にアルファベット順に来る一般的なファイルだけをリストする最良の方法は何ですか?
現在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 bin
find /tmp
修正する:次へ追加減らす()大文字と小文字を区別しない比較を許可します。アルファベット順に質問に記載されている並べ替え...
#!/bin/bash
dir="$1"; ref="$2"
find "$dir" -maxdepth 1 -type f -printf "%f\n" | awk -v"ref=$ref" 'tolower($0) < tolower(ref)'
ソートする必要がある場合は、sort
afterにパイプするだけです。awk