在给定字符串之前按字母顺序查找文件


8

如果我有一个充满文件和子目录的目录。仅列出按字母顺序位于给定字符串前的常规文件的最佳方法是什么?

目前,使用bash可以做的最好的事情如下:

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

   echo $x
done

我觉得有一种更简洁的方法可以执行此操作,但是我不确定它是什么。有任何想法吗?

Answers:


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 2015年

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字段不存在。我想念什么吗?
Mike Deck 2012年

谢谢,我在最后一刻对其进行了快速更改,并错过了该字段(它最初有两个用\ xFF分隔的字段)...现在,我已经睡了一点,我可以看到它不是正确处理案件。我假设由于该问题涉及字母排序规则,因此不区分大小写。我已经更新了答案。
Peter.O 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.