我有一个包含各种子文件夹的父文件夹中的文件列表。这些文件可以存在于任何文件夹中。
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文件。
答案 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"匹配的文件。东西+扩展模式,然后内部测试寻找跟随"食物"扩展名前的字符串。如果那里有一个数字,则将其与当前最高的数字进行比较。