Bash - 查找编号最大的文件

时间:2018-02-17 18:51:52

标签: bash find

我有一个包含各种子文件夹的父文件夹中的文件列表。这些文件可以存在于任何文件夹中。

file1.txt
file2.txt
fileabc.txt
file50.txt
file random string 152.png
file 51.jpg
file99.txt
file150.txt

我希望在这种情况下找到文件字符串旁边最高编号的文件file150.txt。我尝试了一些find,sort和tail的变体,但对于一系列文件来说,没有任何准确性。还有一些情况,文件字符串有一个数字

1file1.txt
1file string.png
1file50.abc
1file 100.abc

在上面的场景中,我想得到1file50,因为它是没有任何空格的最高数字。

我怎样才能在bash中实现这个目标?

我已尝试过此功能,但它仅适用于某些情况。

dir="/dir/"
find $dir -iname "file*" | sort -n | tail -1

编辑:我使用开发者工具bash在Windows 10上。我正在Windows目录中搜索Windows文件。

2 个答案:

答案 0 :(得分:0)

我知道,问题在于子目录。

 find -regextype egrep -iregex ".*1file[0-9]+"  | egrep -o "1file.*" | sort -k 5 -n -r | head -n 1 

如果所有名称都是小写或全部都是大写,则不需要-iname或-iregex。

egrep -o仅捕获“文件”或“1文件”中的部分,并且必须进行调整。对于像“1fileo1file201file400”这样的病态输入,您必须重新考虑问题,并且可能手动更快。 :)

对于带扩展名的文件名:

find -regextype egrep -iregex ".*file[0-9]+.*"  | egrep -o "file[0-9]*" | head -n 5 
file50
file2
file1
file1
file2

按照预期,按位置开始排序对我来说不起作用:

find -regextype egrep -iregex ".*file[0-9]+.*"  | egrep -o "file[0-9]*" | sort -r -k [5] 
file75
file7
file6
file50
file50

find -regextype egrep -iregex ".*file[0-9]+.*"  | egrep -o "file[0-9]*" | sort -r -k [5-7] 
file75
file7
file6
file50
file50

所以我们采取sed:

find -regextype egrep -iregex ".*file[0-9]+.*"  | egrep -i -o "file[0-9]*" | sed 's/file//' | sort -r -n | head -n1 
100

我们知道我们减去了文件,所以文件应该是file100,或者FILE100或FilE100等等,但这可以用

重建
res=100
find -iname "file$res" 
./tmp/A/B/file100

res=$(find -regextype egrep -iregex ".*1file[0-9]+.*"  | egrep -o "1file[0-9]*" | sed 's/1file//' | sort -r -n | head -n1)
find -iname "1file$res*" 
./tmp/A/B/1file250.txt

答案 1 :(得分:0)

特定于bash的选项:使用set -o globstar为您进行递归,然后使用增强的条件表达式运算符=~来拉出数字。

使用此示例结构:

$ tree SomeOrganizedFolder/
SomeOrganizedFolder/
├── Folder1
│   ├── Food1.txt
│   ├── Food2.txt
│   └── SubFolder1
│       └── Food3.jpg
├── Folder2
│   └── Food99.txt
└── Folder3
    └── Food115.txt

运行以下命令:

highest=-1
for file in SomeOrganizedFolder/**/Food*.txt
do
  if [[ $file =~ Food([0-9]+).* ]]
  then
    [[ "${BASH_REMATCH[1]}" -gt "$highest" ]] && highest=${BASH_REMATCH[1]}
  fi
done
echo $highest

for循环仅选择与" Food"匹配的文件。东西+扩展模式,然后内部测试寻找跟随"食物"扩展名前的字符串。如果那里有一个数字,则将其与当前最高的数字进行比较。