私は機能があります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
-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
andとnotの両方を含むファイル名の場合baz
。
このバリアントでは、パラメータにワイルドカードが含まれている場合はそのまま使用して、次のことを行うことができます。
findn foo ! 'bar*'
存在しないファイルを探すスタートバーと。シェルを使用している場合は、zsh
エイリアスを作成できます。
alias findn='noglob findn'
コマンドのワイルドカードを無効にするには、次のように書くことができます。
find foo ! bar*
関数ではなくスクリプト(構文がPOSIXなので、ここではスクリプトで十分です)で作成し、シェルだけでなくsh
どこでも呼び出すことができます。