find - (find . -iname '*$1*') 과 같은 작업을 수행하기 위해 별칭을 만드는 방법은 무엇입니까?

find - (find . -iname '*$1*') 과 같은 작업을 수행하기 위해 별칭을 만드는 방법은 무엇입니까?

나는 findn기능이 있습니다 :

findn () {
    find . -iname "*$1*"
}

이 기능을 사용할 때의 한 가지 단점은 파일 이름에 공백이 포함된 경우 find 명령의 기능을 확장하기 위해 -print0 | xargs -0 command다음을 사용할 수 없다는 것입니다(저는 Mac을 사용하고 있습니다) .findn filename

-iname "*$1*"그렇다면 편리함 과 실용적인 기능을 동시에 유지할 수 있는 방법은 없을까요 ?| xargs command

이 작업을 수행하기 위해 별칭을 사용할 생각이지만 반드시 별칭일 필요는 없습니다.

답변1

귀하의 솔루션은 다음과 같은 용도로 작동합니다 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

답변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-afoo 그리고 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

foobarand 및 not 을 모두 포함하는 파일 이름 의 경우 baz.

해당 변형에서는 매개변수에 와일드카드가 포함된 경우 그대로 사용하여 다음을 수행할 수 있도록 이 작업도 수행했습니다.

findn foo ! 'bar*'

존재하지 않는 파일 찾기시작바와 함께. 셸을 사용하는 경우 zsh별칭을 만들 수 있습니다.

alias findn='noglob findn'

명령에 대한 와일드카드를 비활성화하려면 다음과 같이 작성할 수 있습니다.

find foo ! bar*

함수가 아닌 스크립트(구문이 POSIX이므로 여기에서는 스크립트로 충분함)로 만들어 sh쉘뿐만 아니라 어디에서나 호출할 수 있습니다.

관련 정보