Почему этот нерекурсивный "find" намного медленнее, чем поиск "ls"?
Я написал два разных сценария, как показано ниже:
# Script 1:
current_date=$(date +"%m-%d-%Y")
logsPath="/hadoop_common/smallsite/realtime/current/spark/logs"
find $logsPath -maxdepth 1 -name "*$current_date*" -print > tmp
а также
# Script 2:
current_date=$(date +"%m-%d-%Y")
logsPath="/hadoop_common/smallsite/realtime/current/spark/logs"
ls $logsPath | grep "$current_date" > tmp
sed -i "s|^|$logsPath|" tmp
Первый скрипт занял 24 минуты, чтобы перечислить 2367 filePath, а второй скрипт занял 16 секунд, чтобы перечислить то же число filePath.
Почему такая большая разница? Я запускал их в разные дни, несколько раз и в любом порядке, и всегда первый сценарий занимал более 20 минут, а второй - менее 20 секунд.
ОС: Red Hat
ОБНОВЛЕНИЕ 2
find (GNU findutils) 4.4.2
Я запускал этот скрипт
#!/bin/bash
current_date=$(date +"%m-%d-%Y")
logsPath="/hadoop_common/smallsite/realtime/current/spark/logs"
touch resultStat
date >> resultStat
ls $logsPath | grep "$current_date" > tmp1
sed -i "s|^|$logsPath|" tmp1
date >> resultStat
find $logsPath -maxdepth 1 -type f -name "*$current_date*" -print > tmp2
date >> resultStat
strace ls "$logsPath" 2>&1 | grep -c stat >> resultStat
date >> resultStat
strace find "$logsPath" -maxdepth 1 -name "*$current_date*" -print 2>&1 | grep -c stat >> resultStat
date >> resultStat
ls -1q $logsPath | wc -l >> resultStat
date >> resultStat
files=(/hadoop_common/smallsite/realtime/current/spark/logs/*"$(date +%m-%d-%Y)"* )
date >> resultStat
Содержание resultStat:
Thu Mar 29 19:14:28 UTC 2018
Thu Mar 29 19:14:47 UTC 2018
Thu Mar 29 19:41:26 UTC 2018
14
Thu Mar 29 19:41:44 UTC 2018
189805
Thu Mar 29 20:08:30 UTC 2018
190348
Thu Mar 29 20:08:48 UTC 2018
Thu Mar 29 20:09:06 UTC 2018