info_ip=`wget --tries=1 --timeout=10 -qO- http://ipinfo.io/?callback=callback; echo`
IFS=$'\n'
IP_country=( $(awk -F'[:"]' '/ip/ || /country/{ print $5}' <<<"$info_ip") )
ip=${IP_country[0]}
country=${IP_country[1]}
echo $ip
echo $country
При использовании нескольких выражений в режиме логического ИЛИ с -o
вам необходимо заключить их все в \(... \)
, иначе всегда учитывается результат последнего выражения; и -printf '%f\n'
используется для печати имени файла только с удаленными ведущими каталогами.
find. -type f \( -name '*.pdf' -o -name '*.txt' \) -printf '%f\n'
см.man find
в ОПЕРАТОРЫ раздел о( expr )
:
OPERATORS
...( expr )
Force precedence. Since parentheses are special to the shell, you will normally need to quote them.
так что вы можете использовать пробелы \(... \)
или'('... ')'
(после и перед скобками важны ), чтобы избежать их.
Как уже упоминалось, вам нужно сгруппировать ваши -name
тесты в круглых скобках. Эти круглые скобки должны быть экранированы как \(... \)
или заключены в кавычки, например. '('... ')'
, чтобы защитить их от оболочки (, где они в противном случае обозначали бы подоболочку ).
Использование стандарта find
, а также упрощение работы с суффиксами имен файлов:
set -- txt pdf ods
for suffix do
set -- "$@" -o -name "*.$suffix"
shift
done
shift
find /dir1/dir2/dir3/dir4 \( "$@" \) -type f -exec basename {} \;
Это сначала устанавливает позиционные параметры в список суффиксов имен файлов, которые мы хотели бы видеть (это также можно взять из командной строки, если это скрипт ), и конструирует ИЛИ -список -name
тестов. Затем это используется в командной строке find
.
Затем сама команда find
вызывает утилиту basename
для каждого найденного имени.
В качестве альтернативы мы могли бы вместо этого использовать подстановку параметров, чтобы удалить все, кроме компонента имени файла каждого пути, но для этого мы должны передать пути во встроенный sh -c
скрипт:
# [...] as before [...]
find /dir1/dir2/dir3/dir4 \( "$@" \) -type f -exec sh -c '
for pathname do
printf "%s\n" "${pathname##*/}"
done' sh {} +
Я ожидаю, что это будет работать быстрее, чем вариант с использованием basename
, по крайней мере, если есть много имен файлов для обработки, хотя с GNU basename
от coreutils вы можете использовать -a
или --multiple
, например:
find /dir1/dir2/dir3/dir4 \( "$@" \) -type f -exec basename -a {} +
Это вызовет basename
как можно меньше раз. Но опять же, если у вас установлен coreutils, у вас вполне может быть и findutils с GNU find
, и вы можете использовать -printf '%f\n'
, чтобы сделать то же самое.