Получить слово в каждом цикле, используя переменную цикла

Можно объединить несколько предикатов, связав их.

Нет -oldermt , но можно записать это как -not -newermt .

Вы хотите:

  • -newermt '-15 seconds' , чтобы сказать, что файл имеет возраст менее 15 секунд, и
  • -not -newermt '-2 seconds' , чтобы сказать, что файл имеет возраст более 2 секунд

Попробуйте:

find /my/directory -newermt '-15 seconds' -not -newermt '-2 seconds'

Или, чтобы быть POSIX-совместимым:

find /my/directory -newermt '-15 seconds' \! -newermt '-2 seconds'

-121--25967-

Webmin обычно выполняется как пользователь Apache, а не как root. xinetd , с другой стороны, который может управляться с помощью Webmin, должен выполняться как root, поскольку он привязывается к привилегированным портам ( -121--216758-

Вы не упомянули свою ОС....

Это прекрасно работает с современной реализацией находки, как от FreeBSD или с sfind .

find/my/directory -name '* .jpg' -mtime -15s -mtime + 2s

Sfind является частью инструментов Schily: http://sourceforge.net/projects/schilytools/files/

ВНИМАНИЕ: я только что обнаружил проблему в sfind . Если аргументы -mtime меньше 60s, они будут работать неправильно, так как в данный момент время файла сравнивается с меткой времени 60 секундах в будущем, которая была первоначально вычислена для переключения года для -ls .

BTW: -not не принадлежит find , это непортящийся GNUism.

0
30.05.2018, 03:59
3 ответа

La forma correcta es pasar la variable bash/shellal script awkcomo argumento a través de la opción-v(variable):

i=1;
while [ $i -lt 5 ]; do
    A=$(awk -v i="$i" -F_ '{ print $i }' <<< 'one_two_test_three')
    echo $A
    ((i++))
done

La salida:

one
two
test
three
4
28.01.2020, 02:13

No es necesario un bucle de shell para analizar los datos:

$ awk -F '_' '{ for (i=1; i<=NF; ++i) print $i }' <<<'one_two_test_three'
one
two
test
three

El script analiza la entrada como una_-lista delimitada e imprime cada campo.

Más corto:

$ awk -F '_' 'BEGIN { OFS="\n" } { $1=$1 } 1' <<< 'one_two_test_three'
one
two
test
three

Esto establece el separador de campo de salida en una nueva línea, luego fuerza una nueva -formación de todo el registro (con el nuevo separador insertado )antes de imprimir el registro.

Más corto:

$ tr '_' '\n' <<<'one_two_test_three'
one
two
test
three

Acceso a los datos en un bucle:

tr '_' '\n' <<<'one_two_test_three' |
while read -r word; do
    printf 'Got "%s"\n' "$word"
done

De esta manera, no llama a la utilidad que usa para analizar los datos más de una vez.

4
28.01.2020, 02:13

Asumiendo que los valores no tienen líneas nuevas, entonces :Su código con cambios mínimos para que funcione :El shebang debe ser#!/bin/bash(ksh o zsh )ya que está usando <<<.

i=1
while [ "$i" -le 4 ] 
do
    A=$(awk -v var="$i" -F_ '{print $var}' <<< 'one_two_test_three')
    echo "$A"
    i=$((i+1))
done

Sin embargo, como la cadena proviene del caparazón, esto podría simplificarse a:

IFS=_ read v1 v2 v3 v4 <<<'one_two_test_three'
printf '%s\n' "$v1" "$v2" "$v3" "$v4"

Y usando una matriz de valores (número variable de valores):

#!/bin/bash
IFS=_ read -a v <<<'one_two_test_three'
printf '%s\n' "${v[@]}"

Si se requiere que se use un shell más simple:

#!/bin/sh
IFS=_ read v1 v2 v3 v4  <<-_expandvar_
one_two_test_three
_expandvar_
printf '%s\n' "$v1" "$v2" "$v3" "$v4"

Por supuesto, si no hay necesidad de establecer una variable ni es un problema establecer el valor de IFS en un script:

#/bin/sh
a='one_two_test_three'
IFS=_
set -f
printf '%s\n' $a

Tenga en cuenta que la variable se está utilizando sin -entre comillas, lo que puede ser inseguro.

2
28.01.2020, 02:13

Теги

Похожие вопросы