如果我有一个充满文件和子目录的目录。仅列出按字母顺序排列在给定字符串之前的常规文件的最佳方法是什么?
目前我可以使用 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