在Bash中获取几个按字母顺序排序的文件的子集

时间:2018-11-07 09:35:29

标签: linux bash

假设我有一组文件“ aab.md”,“ aac.md”,“ aad.md” ...“ csdw.md”。内容/文件名实际上位于(非拉丁)utf-8中。它们可以按字母顺序排序。

我如何在Bash中获取这些文件的子集,例如“ aad.md”及更高版本?

1 个答案:

答案 0 :(得分:2)

declare -a files
while IFS=  read -r -d $'\0' file; do
  filename=${file##*/}
  if [[ ! "$filename" < "aad.md" ]]
  then
    files=("${files[@]}" "$file")
  fi
done < <(find . -name "*.md" -print0)

数组"${files[@]}"现在应包含基本名称大于aad.md的文件的路径。

这在bash中使用了许多鲜为人知的技术:数组,前缀替换,零终止记录(及其读取)和进程替换;所以不要犹豫,问是否有不清楚的地方。

请注意,bash [[...]]构造并不了解>=运算符,因此我们需要即兴使用! ...<...

这几乎是纯bash,除了find外没有其他命令。如果您接受外部命令,则$(basename $file)${file##*/}更明显,但是那时候您最好使用awk ...,如果可以使用awk,为什么呢?不是露比吗?

ruby -e "puts Dir['**/*.md'].select{|x| File.basename(x) >= 'aad.md'}"