Используйтеfind -exec
cd /path/to/source
find. -size -50k -type f -exec cp --parents {} /destination/ \;
Распространенным способом проверки ввода является использование бесконечного цикла, из которого вы выходите, как только ввод подтвержден.
В данном случае «проверено» означает, что входная строка содержит только восемь цифр и что GNU date
может использовать эту дату в качестве аргумента опции для своей опции -d
.
С помощью bash
мы могли бы записать это как
while true; do
read -r -p 'Input date: '
if [[ $REPLY =~ ^[[:digit:]]{8}$ ]] && date -d "$REPLY" >/dev/null 2>&1
then
break
fi
echo 'Invalid format, try again' >&2
done
thedate=$REPLY
Это считывает дату в начале нашего цикла, а затем проверяет ее с помощью регулярного выражения, которое будет соответствовать, если строка содержит только восемь цифр. Если этот тест проходит успешно, строка также проверяется с помощью GNU date
. Если все идет хорошо, выход из цикла выполняется с помощью оператора break
.
В sh
нам нужно заменить сопоставление регулярного выражения на соответствие шаблону оболочки:
while true; do
printf 'Input date: ' >&2
read -r REPLY
case $REPLY in
*[![:digit:]]*)
;;
????????)
date -d "$REPLY" >/dev/null 2>&1 && break
esac
echo 'Invalid format, try again' >&2
done
thedate=$REPLY
Тест здесь сначала проверяет, содержит ли строка какой-либо другой символ, кроме цифры.Если этот тест не пройден, следующий тест проводится ровно для восьми символов. Если этот тест проходит успешно, у нас есть строка из восьми цифр, и мы проверяем ее с помощью GNU date
и выходим из цикла, если дата в порядке.
Или без бесконечного цикла и с использованием команды BSD date(1)
:
REPLY=
valid=false
while ! $valid; do
read -r -p 'Input date: '
if ([[ $REPLY =~ ^[[:digit:]]{8}$ ]]) && (date -j +%Y%m%d ${REPLY}0000 >/dev/null 2>&1)
then
valid=true
else
echo 'Invalid format, try again' >&2
fi
done
thedate=$REPLY
Синтаксис ${REPLY}0000
необходим, поскольку BSD date
требует полного YmdHM, но достаточно установить HM по умолчанию на 0000
.