나는 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
-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
쉘뿐만 아니라 어디에서나 호출할 수 있습니다.