sh -c 'grep ...'을 통해 지정된 출력 형식을 얻기 위해 find -exec 명령을 사용하는 방법

sh -c 'grep ...'을 통해 지정된 출력 형식을 얻기 위해 find -exec 명령을 사용하는 방법

고정된 문자열이 포함된 해당 파일을 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 fgrepgrep -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

관련 정보