find - (find . -iname '*$1*') のような操作を実行するためにエイリアスを作成するには?

find - (find . -iname '*$1*') のような操作を実行するためにエイリアスを作成するには?

私は機能がありますfindn

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

この機能を使用することの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

GNUfindまたは互換性のある方法(-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どこでも呼び出すことができます。

関連情報