find - как мне создать псевдоним, чтобы делать что-то вроде (find . -iname '*$1*')?

Aquí hay una solución simple, que funcionará si eres root.

su $uid -c kill SIGSTOP -1

Explicación :Conviértete en ese usuario y mata todo lo que puedas.


Todas las soluciones requerirán el permiso CAP _KILL (para eliminar cualquier proceso ), o ser root tradicional (root tiene este permiso ), y permiso (capacidad para cambiar su propio uid ), como se usa en esta solución.

Tenga en cuenta que envié sigstop, esto detendrá el proceso (según lo solicitado ☺ ). Elige la señal que quieras. Utilice sigkill como último recurso.

2
26.06.2019, 09:03
2 ответа

Одним из способов с GNU findили совместимым(-inameуже является расширение GNU в любом случае )может быть определение функции как:

findn() (
  if [ -t 1 ]; then # if the output goes to a terminal
    action=-print  # simple print for the user to see
  else
    action=-print0 # NUL-delimited records so the output can be post-processed
  fi
  first=true
  for arg do
    if "$first"; then
      set -- "$@" '('
      first=false
    else
      set -- "$@" -o
    fi
    set -- "$@" -iname "*$arg*"
    shift
  done
  "$first" || set -- "$@" ')'
  exec find. "$@" "$action"
)

Затем вы можете использовать его как:

findn foo bar

Для см. имена файлов, которые содержат fooили bar(, измените -oна -aвыше, если вы хотите, чтобы они содержали как foo, так иbar).

И:

findn foo bar | xargs -r0 cat

Если вы хотите применить команду к каждому файлу, найденному с помощью findn.

Для варианта, который выполняет и , и , и , но не:

findn() (
  if [ -t 1 ]; then # if the output goes to a terminal
    action=-print  # simple print for the user to see
  else
    action=-print0 # NUL-delimited records so the output can be post-processed
  fi
  first=true
  for arg do
    if "$first"; then
      set -- "$@" '('
      first=false
    else
      set -- "$@"
    fi
    if [ "$arg" = ! ]; then
      set -- "$@" !
    else
      case $arg in
        (*[][*?\\]*)
          # already contains wildcard characters, don't wrap in *
          set -- "$@" -iname "$arg"
          ;;
        (*)
          set -- "$@" -iname "*$arg*"
          ;;
      esac
    fi
    shift
  done
  "$first" || set -- "$@" ')'
  exec find. "$@" "$action"
)

А затем:

findn foo bar ! baz

Для имен файлов, содержащих как foo, так и bar, но не baz.

В этом варианте я также сделал так, что если аргумент содержал подстановочный знак, он воспринимался как -, так что вы можете сделать:

findn foo ! 'bar*'

Для поиска файлов, которые не начинаются с бара. Если вы используете оболочку zsh, вы можете создать псевдоним:

alias findn='noglob findn'

Чтобы отключить подстановку для этой команды, которая позволяет вам писать:

find foo ! bar*

Вы можете захотеть сделать это скриптом (здесь скрипта shдостаточно, так как это синтаксис POSIX )вместо функции, поэтому его можно вызывать из любого места, а не только из вашей оболочки.

2
27.01.2020, 21:53

Ваше решение отлично работает сxargs:

$ echo "foo bar one" > foobarone
$ echo "foo bar two" > fooBARtwo
$ findn "bar"
./fooBARtwo
./foobarone
$ findn "bar" | xargs cat
foo bar two
foo bar one

Или я что-то пропустил?

И если вы немного измените свою функцию, вы можете добавить дополнительные параметры в свою команду find:

findn () {
  local name=$1
  shift
  find. -iname "*$name*" "$@"
}

Пример:

$ findn bar ! -name '*two' -print0 | xargs -0 cat
foo bar one
4
27.01.2020, 21:53

Теги

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