고정된 문자열이 포함된 해당 파일을 grep한 다음 이 파일만 ls -l 형식으로 출력하려고 합니다.
예:
A) 다음 방법은 여러 -execs를 사용하여 grep 및 ls -l을 출력합니다.
#
#
# find /usr/bin -type f -exec grep -Eil '#\!\/usr\/bin\/csh' {} \; -exec ls -l {} \; >scripts_csh_list 2>&1
#
#
#
# cat scripts_csh_list
/usr/bin/which
-r-xr-xr-x 1 bin bin 1191 Sep 06 2007 /usr/bin/which
#
#
B) 하지만 우리는 ls -l ...만 사용하고 sh -c 'grep ... {}'로 실패하여 출력을 얻는 더 나은 방법을 원합니다.
참고: 다음 명령과 find -exec ..의 모든 다른 조합은 다음과 같습니다. 동일한 실패 결과를 출력합니다.
#
#
# find /usr/bin -type f -exec sh -c 'grep -Eil '\/usr\/bin\/csh' {} && ls -ltr {}' \; >scripts_csh_list 2>&1t
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
#
# find /usr/bin -type f -exec sh -c ' grep -Eil '\/usr\/bin\/csh' {} ' \; >scripts_csh_list 2>&1
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
# find /usr/bin -type f -exec sh -c ' grep -Eil '\/usr\/bin\/csh' "{}" ' \; >scripts_csh_list 2>&1
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
#
# find /usr/bin -type f -exec sh -c " grep -Eil '\/usr\/bin\/csh' {} " \; >scripts_csh_list 2>&1
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
#
# find /usr/bin -type f -exec sh -c " grep -Eil '\/usr\/bin\/csh' {} " \; >scripts_csh_list 2>&1
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
답변1
원문에는 불필요해 보이는 인용문과 비유가 많이 있습니다. 에 csh
스크립트 가 없지만 다음을 /usr/bin
통해 bash
스크립트를 찾고 ls
원하는 출력을 얻을 수 있었습니다.
find /usr/bin -type f -exec grep -q '#!/usr/bin/bash' {} \; -exec ls -l {} \; 2> /dev/null
(두 번째 항목 없이 실행하여 이를 확인했습니다 -exec
.
find /usr/bin -type f -exec grep -q '#!/usr/bin/bash' {} \; 2> /dev/null
결과를 확인하세요. )
약간 다른 출력 목록의 경우 다음을 수행할 수도 있습니다.
find /usr/bin -type f -exec grep -q '#!/usr/bin/bash' {} \; -ls 2> /dev/null
일치 find
하는 각 파일 자체를 직접 계산하고 ls
유사한 결과를 반환합니다.
테스트할 때 더 쉽게 읽을 수 있도록 오류를 파이핑하고 있습니다 /dev/null
. 비슷한 이유로 출력을 파일로 파이핑하지 않습니다.
저는 bash
쉘을 사용하고 있으므로 grep
표현식을 작은따옴표( '...'
)로 묶는 것만으로도 내용이 해석되는 것을 방지할 수 있습니다(걱정할 부분은 많지 않습니다. 슬래시( /
)는 쉘에 중요하지 않습니다. 특별하지 않습니다. 다른 인용 규칙인 YMMV를 사용하는 쉘을 사용하는 경우 적어도 bash에는 해당되지 않습니다.
명령의 경우 해당 -o
옵션을 사용하지 않으면 모든 조건이 결합 find
되므로 AND
명령은 ls -l
검사를 통과한 일반 파일(포함한 파일)에서만 실행됩니다. 귀하의 질문에 대한 의견에서 지적했듯이, 귀하가 원하는 것을 수행하는 것이 가능합니다. 즉, 문제의 파일()이 일치하는지 확인하는 것입니다.type f
grep
grep -q
{}
편집: 주석에서 언급했듯이 사용자의 쉘이 표현식 에서 이스케이프 csh
되어야 하는 경우 : 가 작동해야 합니다.!
grep
'#\!/usr/bin/bash'
답변2
sh -c 'grep ... '
마지막으로 with 명령을 통해 다음과 같은 올바른 방법을 수행했습니다 find -exec
. 다들 감사 해요!
# find /usr/bin -type f -exec sh -c ' grep -q ''\#'\!/usr/bin/csh' "$1" && ls -l "$1" ' sh {} \; >scripts_csh_list 2>&1
# head -3 scripts_csh_list
-r-xr-xr-x 1 bin bin 1191 Sep 06 2007 /usr/bin/which