find . -type f | awk -F / '{a[$2]=a[$2] " " $0}; END {for(b in a){print a[b]}}'
Может быть, это вам поможет. Я интегрировал их оба, правда, с небольшими изменениями. Вот результат.
BEGIN=$(date +%s)
echo Starting Stopwatch...
echo Press Q to exit.
while true; do
NOW=$(date +%s)
let DIFF=$(($NOW - $BEGIN))
let MINS=$(($DIFF / 60))
let SECS=$(($DIFF % 60))
let HOURS=$(($DIFF / 3600))
let DAYS=$(($DIFF / 86400))
# \r is a "carriage return" - returns cursor to start of line
printf "\r%3d Days, %02d:%02d:%02d" $DAYS $HOURS $MINS $SECS
# In the following line -t for timeout, -N for just 1 character
read -t 0.25 -N 1 input
if [[ $input = "q" ]] || [[ $input = "Q" ]]; then
# The following line is for the prompt to appear on a new line.
echo
break
fi
done
Как видите, я поместил второй сценарий вместо команды sleep
в предыдущем первом. Тайм-аут в , чтение
теперь имеет функцию замедленной съемки. Обратите внимание, что параметр -N
необходим для чтения
, чтобы не ждать , введите и реагировать, как только будет нажата первая клавиша.
На основе этого ответа вы можете использовать читать
с параметром -t
, так что он ждет только определенное время, а не бесконечно. В приведенном ниже коде объединены два опубликованных вами фрагмента:
#!/bin/bash
begin=$(date +%s)
echo "Starting Stopwatch... Press q to exit"
while true; do
now=$(date +%s)
diff=$(($now - $begin))
mins=$(($diff / 60))
secs=$(($diff % 60))
hours=$(($diff / 3600))
days=$(($diff / 86400))
# \r is a "carriage return" - returns cursor to start of line
# with \33[2K we clear the current line
printf "\33[2K\r%3d Days, %02d:%02d:%02d" $days $hours $mins $secs
# -n 1 to get one character at a time, -t 0.1 to set a timeout
read -n 1 -t 0.1 input # so read doesn't hang
if [[ $input = "q" ]] || [[ $input = "Q" ]]
then
echo # to get a newline after quitting
break
fi
done
Я предпочитаю более лаконичный until
...
until read -s -n 1 -t 0.01; do
echo -n "."
sleep.5
done
echo
Единственной незначительной проблемой является отображение одного символа.