νƒœκ·Έ 보관물: find

find

β€˜μ•‘μ„ΈμŠ€ 거뢀’라인 κΊΌλ‚΄κΈ° ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€ . 그듀을 μ œκ±°ν•˜κΈ° μœ„ν•΄

λ””λ ‰ν† λ¦¬μ˜ findλͺ¨λ“  pdf νŒŒμΌμ„ λ³Ό λ•Œ μ‚¬μš© ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€ . 그듀을 μ œκ±°ν•˜κΈ° μœ„ν•΄ μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€./homeaccess denied

find /home -iname "*.pdf" | grep -v "access denied"

κ·ΈλŸ¬λ‚˜ κ²°κ³ΌλŠ” λ™μΌν•©λ‹ˆλ‹€. 이 쀄을 μ–΄λ–»κ²Œ 제거 ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?



λ‹΅λ³€

access denied좜λ ₯이 였λ₯˜μ΄λ©°μ— νŒŒμ΄ν”„λ˜λŠ” STDOUT λŒ€μ‹  STDERR둜 μ „μ†‘λ˜μ–΄ μ‹œλ„ν–ˆκΈ° λ•Œλ¬Έμ— μž‘λ™ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€ grep.

STDERR 만 λ¦¬λ””λ ‰μ…˜ν•˜μ—¬ μ΄λŸ¬ν•œ 였λ₯˜κ°€ ν‘œμ‹œλ˜μ§€ μ•Šλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€

find /home -iname "*.pdf" 2>/dev/null

λ˜λŠ” David Foersterκ°€ μ–ΈκΈ‰ν–ˆλ“―μ΄ STDERR을 더 κ°„κ²°ν•˜κ²Œ 닫을 수 μžˆμŠ΅λ‹ˆλ‹€.

find /home -iname "*.pdf" 2>&-

κ·ΈλŸ¬λ‚˜ μ‹€μ œλ‘œ λ‹€λ₯Έ μ‚¬μš©μžλ³΄λ‹€λŠ” 집을 κ²€μƒ‰ν•˜κ³  μ‹ΆκΈ° λ•Œλ¬Έμ— μ‹€μ œλ‘œ μ›ν•˜λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

find ~ -iname "*.pdf"

였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 둜컬 ꡬ성에 잘λͺ»λœ μ†Œμœ κΆŒμ΄μžˆμ„ 수 μžˆμœΌλ―€λ‘œ μ‘°μ‚¬ν•΄μ•Όν•©λ‹ˆλ‹€.


λ‹΅λ³€

μ•‘μ„ΈμŠ€ κ±°λΆ€κ°€ stderrμ•„λ‹Œ 에 인쇄 될 수 stdoutμžˆμŠ΅λ‹ˆλ‹€.

이 μ‹œλ„:

find /home -iname "*.pdf" 2>&1 | grep -v "access denied"

λŠ” 2>&1의 좜λ ₯ λ¦¬λ””λ ‰μ…˜ stderr에λ₯Ό stdoutκ·Έ λ•Œλ¬Έμ—, grep -vκ·Έ 일을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (기본적으둜 |νŒŒμ΄ν”„ 만 stdout있고 stderr)


λ‹΅λ³€

당신은 μ•„λ§ˆ 평균 무엇인가 – μ–΄λ–€ β€œμ‚¬μš© κΆŒν•œμ΄ κ±°λΆ€λ˜μ—ˆμŠ΅λ‹ˆλ‹€β€ findμš°λΆ„νˆ¬ μ‡Όμ—μ„œ 당신이 λ•Œλ¬Έμ— 파일 κΆŒν•œ-λ³΄λ‹€λŠ” μ•„λ‹ˆ μ•‘μ„ΈμŠ€ λ­”κ°€ β€œμ•‘μ„ΈμŠ€ 거뢀”할 수 μžˆμŠ΅λ‹ˆλ‹€.

이 μž‘μ—…μ„ μ˜¬λ°”λ₯΄κ²Œ μˆ˜ν–‰ν•˜λŠ” μ™„μ „νžˆ 일반적인 λͺ…λ Ή ν•˜λ‚˜ (그리고 λ³΄λ„ˆμŠ€ λ©”μ‹œμ§€λŠ” 였λ₯˜ λ©”μ‹œμ§€κ°€ λ™μΌν•œ ν•œ λ‹€λ₯Έ * nix es둜 이식 κ°€λŠ₯ )λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

(find 3>&1 1>&2 2>&3 3>&- | grep -Fv 'Permission denied') 3>&1 1>&2 2>&3 3>&-

(보톡 당신은 λͺ‡ 가지 인수λ₯Ό μ „λ‹¬ν•˜λ €κ³ ν•©λ‹ˆλ‹€ find. 첫 번째 λ¦¬λ””λ ‰μ…˜ μ „μ—κ°‘λ‹ˆλ‹€ 3>&1.)

κ·ΈλŸ¬λ‚˜ μ’…μ’… 더 κ°„λ‹¨ν•œ 것을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ ν”„λ‘œμ„ΈμŠ€ λŒ€μ²΄λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ . μžμ„Έν•œ λ‚΄μš©μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

κ°€μž₯ 일반적인 방법과 ν•œκ³„

두 개의 일반적인 μ ‘κ·Ό 방식은 버릴 수 μžˆμŠ΅λ‹ˆλ‹€ ν‘œμ€€ 였λ₯˜ (같이 ZANNA의 λŒ€λ‹΅ ) λ‚˜μ— λŒ€ν•œ ν‘œμ€€ 였λ₯˜ λ¦¬λ””λ ‰μ…˜ ν‘œμ€€ 좜λ ₯ (같이 및 ν•„ν„° ν‘œμ€€ 좜λ ₯을 μ•ˆλ“œλ‘œμ΄λ“œ 데브의 λŒ€λ‹΅ ). 그것듀은 μž‘μ„±ν•˜κΈ° μ‰½λ‹€λŠ” μž₯점이 있으며 μ’…μ’… 합리적인 μ„ νƒμ΄μ§€λ§Œ, μ΄λŸ¬ν•œ 접근법은 이상적이지 μ•ŠμŠ΅λ‹ˆλ‹€.

stderr둜 전솑 된 λͺ¨λ“  ν•­λͺ©μ„ 폐기 ν•˜λ©΄ (예 : 널 μž₯치 둜 λ¦¬λ””λ ‰μ…˜ 2>/dev/nullν•˜κ±°λ‚˜ λ‹«λŠ” 2>&-λ“±) β€œPermission deniedβ€μ΄μ™Έμ˜ 였λ₯˜κ°€ λ°œμƒν•  μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.

β€œκΆŒν•œμ΄ κ±°λΆ€λ˜μ—ˆμŠ΅λ‹ˆλ‹€β€λŠ” μ‹€ν–‰ν•  λ•Œ λ°œμƒν•˜λŠ” κ°€μž₯ 일반적인 였λ₯˜ 일 수 findμžˆμ§€λ§Œ κ°€λŠ₯ν•œ μœ μΌν•œ 였λ₯˜λŠ” μ•„λ‹ˆλ©° λ‹€λ₯Έ 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 이에 λŒ€ν•΄ μ•Œκ³  싢을 수 μžˆμŠ΅λ‹ˆλ‹€. 특히 findμ‹œμž‘μ μ΄ μ—†μœΌλ©΄ β€œν•΄λ‹Ή 파일 λ˜λŠ” 디렉토리가 μ—†μŠ΅λ‹ˆλ‹€β€λΌκ³ λ³΄κ³ ν•©λ‹ˆλ‹€. μ‹œμž‘μ μ΄ μ—¬λŸ¬ 개인 findκ²½μš°μ—λ„ μ—¬μ „νžˆ μœ μš©ν•œ κ²°κ³Όκ°€ λ°˜ν™˜λ˜μ–΄ μž‘λ™ν•˜λŠ” κ²ƒμ²˜λŸΌ 보일 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, a및 cμ‘΄μž¬ν•˜μ§€λ§Œ 쑴재 bν•˜μ§€ μ•ŠλŠ” κ²½μš°μ— find a b c -name xκ²°κ³Όλ₯Ό 인쇄 aν•œ λ‹€μŒμ— β€œNo such file or directory”λ₯Ό ν‘œμ‹œ bν•œ λ‹€μŒ κ²°κ³Όλ₯Ό ν‘œμ‹œ cν•©λ‹ˆλ‹€.

ν‘œμ€€ 좜λ ₯으둜 ν•¨κ»˜ ν‘œμ€€ 좜λ ₯κ³Ό ν‘œμ€€ μ—λŸ¬λ₯Ό κ²°ν•©ν•˜κ³  λ°°κ΄€ 으둜 grepλ˜λŠ” λ‹€λ₯Έ λͺ…λ Ήκ³Όν•˜λ©΄μœΌλ‘œν•˜λŠ” ν•„ν„° 2>&1 | grep ...λ˜λŠ” |& grep ...μ‹€μˆ˜λ‘œ 이름이 μ—¬κ³Όλ˜λŠ” λ©”μ‹œμ§€λ₯Ό ν¬ν•¨ν•˜λŠ” νŒŒμΌμ„ ν•„ν„°λ§μ˜ μœ„ν—˜ -runs.

예λ₯Ό λ“€μ–΄ β€œPermission denied”가 포함 된 행을 ν•„ν„°λ§ν•˜λ©΄ β€œPermission denied messages.txt”와 같은 파일 이름을 ν‘œμ‹œν•˜λŠ” 검색 결과도 μ‚­μ œλ©λ‹ˆλ‹€. 검색을 λ°©ν•΄ ν•  수 μžˆλ„λ‘ νŠΉμˆ˜ν•˜κ²Œ μ‘°μž‘ 된 이름을 νŒŒμΌμ— λΆ€μ—¬ν•˜λŠ” 것도 κ°€λŠ₯ν•˜μ§€λ§Œ μš°μ—°νžˆ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ²°ν•© 된 μŠ€νŠΈλ¦Όμ„ μ—¬κ³Όν•˜λŠ” 것은 또 λ‹€λ₯Έ 문제점이 μžˆλŠ”λ°, μ΄λŠ”grep -vx 'find: .*: Permission denied' νŒŒμ΄ν”„μ˜ μš°μΈ‘μ—μ„œ 와 같이 보닀 μ„ νƒμ μœΌλ‘œ μ—¬κ³Όν•¨μœΌλ‘œμ¨ μ™„ν™” 될 수 μ—†λ‹€ . find쑰치 -printλ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ„ λ•Œ λ‚΄μž¬ 된 쑰치λ₯Ό ν¬ν•¨ν•˜μ—¬ 일뢀 쑰치 λŠ” stdout 이 터미널 인지 여뢀에 따라 파일 이름을 좜λ ₯ν•˜λŠ” 방법을 κ²°μ •ν•©λ‹ˆλ‹€ .

  • 터미널 이 μ•„λ‹Œ 경우 파일 이름은 쀄 λ°”κΏˆκ³Ό 같은 μ΄μƒν•œ λ¬Έμžμ™€ ν„°λ―Έλ„μ˜ λ™μž‘μ„ λ³€κ²½ν•  μˆ˜μžˆλŠ” μ œμ–΄ λ¬Έμžμ™€ 같은 μ΄μƒν•œ 문자λ₯Ό ν¬ν•¨ν•˜λ”λΌλ„ κ·ΈλŒ€λ‘œ 좜λ ₯λ©λ‹ˆλ‹€. 이 경우 μž…λ‹ˆλ‹€ 터미널, 이듀 λ¬ΈμžλŠ” μ–΅μ œν•˜κ³  ?λŒ€μ‹  μΈμ‡„λ©λ‹ˆλ‹€.
  • 이것은 일반적으둜 μ›ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 파일 이름을 더 μ²˜λ¦¬ν•˜λ €λ©΄ 문자 κ·ΈλŒ€λ‘œ 좜λ ₯ν•΄μ•Όν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ νŒŒμΌμ„ ν‘œμ‹œν•˜λ €λŠ” 경우 쀄 λ°”κΏˆμ΄μžˆλŠ” 파일 이름은 μ—¬λŸ¬ 파일 이름을 λͺ¨λ°© ν•  수 있으며 일련의 λ°± 슀페이슀 λ¬Έμžκ°€μžˆλŠ” 파일 이름은 λ‹€λ₯Έ μ΄λ¦„μœΌλ‘œ ν‘œμ‹œ 될 수 μžˆμŠ΅λ‹ˆλ‹€. ν„°λ―Έλ„μ˜ 색상을 λ³€κ²½ν•˜λŠ” μ΄μŠ€μΌ€μ΄ν”„ μ‹œν€€μŠ€κ°€ ​​포함 된 파일 이름과 같은 λ‹€λ₯Έ λ¬Έμ œλ„ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • κ·ΈλŸ¬λ‚˜ 같은 λ‹€λ₯Έ λͺ…령을 톡해 검색 κ²°κ³Όλ₯Ό νŒŒμ΄ν•‘ grepν•˜λ©΄ find더 이상 터미널이 ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (더 μ •ν™•ν•˜κ²Œ λ§ν•˜λ©΄, stdout이 ν„°λ―Έλ„μ΄λ˜μ§€ μ•Šκ²Œλ©λ‹ˆλ‹€.) 그러면 μ΄μƒν•œ λ¬Έμžκ°€ 문자 κ·ΈλŒ€λ‘œ 좜λ ₯λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ νŒŒμ΄ν”„μ˜ 였λ₯Έμͺ½μ—μžˆλŠ” λͺ¨λ“  λͺ…령이 (a) β€œPermission deniedβ€λ©”μ‹œμ§€μ²˜λŸΌ λ³΄μ΄λŠ” 행을 μ œκ±°ν•˜κ³  (b) λ‚¨μ•„μžˆλŠ” 것을 μΈμ‡„ν•˜λŠ” 경우 μ—¬μ „νžˆ find터미널 인 shenanigans에 μ’…μ†λ©λ‹ˆλ‹€. κ°μ§€λŠ” λ°©μ§€ν•˜κΈ°μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€.
  • man find파일 이름을 μΈμ‡„ν•˜λŠ” 각 λ™μž‘μ˜ λ™μž‘μ„ ν¬ν•¨ν•˜μ—¬ μžμ„Έν•œ λ‚΄μš©μ€ 비정상적인 파일 이름 μ„Ήμ…˜μ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€ . ( β€œλ§Žμ€ find λ™μž‘μ€ λ‹€λ₯Έ μ‚¬μš©μžμ˜ ν†΅μ œν•˜μ—μžˆλŠ” 데이터λ₯Ό 인쇄 ν•  λ•Œ λ°œμƒν•©λ‹ˆλ‹€ …” ) GNU Findutils μ°Έμ‘° 맀뉴얼 의 3.3.2.1 , 3.3.2.2 및 3.3.2.3 μ ˆλ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€ .

비정상적인 파일 이름에 λŒ€ν•œ μœ„μ˜ λ…Όμ˜λŠ” GNU find 와 κ΄€λ ¨ 이 있으며, μ΄λŠ” findUbuntuλ₯Ό ν¬ν•¨ν•œ GNU / Linux μ‹œμŠ€ν…œμ—μ„œ κ΅¬ν˜„λ©λ‹ˆλ‹€.

ν‘œμ€€ 였λ₯˜λ₯Ό ν•„ν„°λ§ν•˜λŠ” λ™μ•ˆ ν‘œμ€€ 좜λ ₯을 κ·ΈλŒ€λ‘œ μœ μ§€

당신이 μ •λ§λ‘œ μ›ν•˜λŠ” 것은 stderr λ₯Ό λ°°κ΄€ν•˜λŠ” λ™μ•ˆ stdout을 κ·ΈλŒ€λ‘œ λ‘λŠ” 것 μž…λ‹ˆλ‹€. λΆˆν–‰νžˆλ„ 이에 λŒ€ν•œ κ°„λ‹¨ν•œ ꡬ문은 μ—†μŠ΅λ‹ˆλ‹€. νŒŒμ΄ν”„ stdout 및을 ν¬ν•¨ν•˜μ—¬ 일뢀 μ‰˜ (을 ν¬ν•¨ν•˜μ—¬ )이 두 μŠ€νŠΈλ¦Όμ„ λͺ¨λ‘ νŒŒμ΄ν”„ ν•˜λ„λ‘ 지원 ν•˜κ±°λ‚˜ stderrλ₯Ό stdout으둜 λ¨Όμ € λ¦¬λ””λ ‰μ…˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ . κ·ΈλŸ¬λ‚˜ 일반적으둜 μ‚¬μš©λ˜λŠ” μ‰˜μ€ νŒŒμ΄ν”„ stderrμ—λ§Œ ꡬ문을 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.grep|bash|&2>&1 |

μ—¬μ „νžˆ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ–΄μƒ‰ν•˜λ‹€. ν•œ 가지 방법은 stdout을 stderr둜 λ°”κΎΈμ–΄ 검색 κ²°κ³Όκ°€ stderr에 있고 였λ₯˜κ°€ stdoutμ—μžˆλŠ” 경우 stdout을 νŒŒμ΄ν”„ grepν•˜μ—¬ ν•„ν„°λ§ν•©λ‹ˆλ‹€.

find args 3>&1 1>&2 2>&3 3>&- | grep -Fv 'Permission denied'

일반적 find으둜 μ‹œμž‘μ  (일반적으둜 디렉토리 인 검색 μœ„μΉ˜) 및 μˆ μ–΄ (ν…ŒμŠ€νŠΈ 및 쑰치)와 같은 인수λ₯Όμ— 전달 ν•©λ‹ˆλ‹€. 이듀은 argsμœ„ λŒ€μ‹  μ‚¬μš© λ©λ‹ˆλ‹€.

이것은 κ΅ν™˜ν•˜λ €λŠ” 두 ν‘œμ€€ 슀트림 쀑 ν•˜λ‚˜λ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•΄ μƒˆ 파일 λ””μŠ€ν¬λ¦½ν„° λ₯Ό λ„μž… ν•˜κ³ ,이λ₯Ό 재 μ§€μ •ν•˜κΈ° μœ„ν•΄ 경둜 재 지정을 μˆ˜ν–‰ν•˜κ³ , μƒˆ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ‹«μ•„ μž‘λ™ν•©λ‹ˆλ‹€.

  • 파일 λ””μŠ€ν¬λ¦½ν„° 1은 stdout이고 2λŠ” stderrμž…λ‹ˆλ‹€ (그리고 경둜 재 μ§€μ •λ˜μ§€ μ•Šμ€ 0은 stdin ). κ·ΈλŸ¬λ‚˜ λ‹€λ₯Έ 파일 μ„€λͺ…μžλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¦¬λ””λ ‰μ…˜ ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. νŒŒμΌμ΄λ‚˜ μž₯치λ₯Ό μ—΄κ±° λ‚˜ μ—΄μ–΄ λ‘λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 3>&1 stdout (파일 μ„€λͺ…μž 1)이 λ‚˜μ€‘μ— λ¦¬λ””λ ‰μ…˜ 될 λ•Œ μ›λž˜ stdout을 μ‰½κ²Œ μ“Έ 수 μžˆλ„λ‘ 파일 μ„€λͺ…μž 3을 stdout으둜 λ¦¬λ””λ ‰μ…˜ν•©λ‹ˆλ‹€.
  • 1>&2stdout을 stderr둜 λ¦¬λ””λ ‰μ…˜ν•©λ‹ˆλ‹€. 파일 λ””μŠ€ν¬λ¦½ν„° 3은 μ—¬μ „νžˆ β€‹β€‹μ›λž˜ stdoutμ΄λ―€λ‘œ μ—¬μ „νžˆ μ•‘μ„ΈμŠ€ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 2>&3 stderr을 μ›λž˜ stdout 인 파일 λ””μŠ€ν¬λ¦½ν„° 3으둜 경둜 재 μ§€μ •ν•©λ‹ˆλ‹€.
  • 3>&- 더 이상 ν•„μš”ν•˜μ§€ μ•Šμ€ 파일 μ„€λͺ…μž 3을 λ‹«μŠ΅λ‹ˆλ‹€.
  • μžμ„Έν•œ λ‚΄μš©μ€ stdout이 μ•„λ‹Œ stderrλ₯Ό νŒŒμ΄ν”„ν•˜λŠ” 방법을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€ . 및 IO 재 지정 – ν‘œμ€€ 좜λ ₯κ³Ό ν‘œμ€€ μ—λŸ¬ (κ³ κΈ‰) μŠ€μ™€ν•‘ 특히 ν•„ν„°λ₯Ό ν†΅ν•΄μ„œλ§Œ ν‘œμ€€ 였λ₯˜ νŒŒμ΄ν”„λ₯Ό .

κ·ΈλŸ¬λ‚˜μ΄ 방법은 검색 κ²°κ³Όκ°€ stderr둜 μ „μ†‘λ˜κ³  였λ₯˜κ°€ stdout으둜 전솑 λ˜λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€. λŒ€ν™”μ‹ μ‰˜μ—μ„œ 직접이 λͺ…령을 μ‹€ν–‰ν•˜κ³  더 이상 좜λ ₯을 νŒŒμ΄ν•‘ν•˜κ±°λ‚˜ λ¦¬λ””λ ‰μ…˜ν•˜μ§€ μ•ŠμœΌλ©΄ μ‹€μ œλ‘œ μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ λ¬Έμ œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή λͺ…령을 μŠ€ν¬λ¦½νŠΈμ— 넣은 λ‹€μŒ λˆ„κ΅°κ°€ (μ•„λ§ˆ λ‚˜μ€‘μ— λ‚˜μ€‘μ—) 좜λ ₯을 재 μ§€μ •ν•˜κ±°λ‚˜ νŒŒμ΄ν”„ ν•˜λ©΄ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ .

해결책은 좜λ ₯ 필터링이 λλ‚˜λ©΄ μŠ€νŠΈλ¦Όμ„ λ‹€μ‹œ λ°”κΎΈλŠ” 것 μž…λ‹ˆλ‹€. νŒŒμ΄ν”„ 라인의 였λ₯Έμͺ½μ— μœ„μ— ν‘œμ‹œλœ λ™μΌν•œ λ¦¬λ””λ ‰μ…˜μ„ μ μš©ν•˜λ©΄ |νŒŒμ΄ν”„ stdout 만 κ°€λŠ₯ν•˜λ―€λ‘œ νŒŒμ΄ν”„ 라인의 츑면은 μ›λž˜ 슀트림이 κ΅ν™˜λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μ›λž˜ stderr둜 전솑 된 좜λ ₯ 만 μˆ˜μ‹ ν•˜κΈ° λ•Œλ¬Έμ—μ΄λ₯Ό λ‹¬μ„±ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€ ν‘œμ€€ 좜λ ₯. λŒ€μ‹  μ„œλΈŒ μ‰˜ ( related ) μ—μ„œ( ) μœ„μ˜ λͺ…령을 μ‹€ν–‰ ν•œ λ‹€μŒ μŠ€μ™‘ ν•‘ λ¦¬λ””λ ‰μ…˜μ„ 적용 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

(find args 3>&1 1>&2 2>&3 3>&- | grep -Fv 'Permission denied') 3>&1 1>&2 2>&3 3>&-

이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것은 특히 μ„œλΈŒ μ‰˜μ΄ μ•„λ‹Œ κ·Έλ£Ήν™”μž…λ‹ˆλ‹€. μ›ν•˜λŠ” 경우 λ‹€μŒμ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ { ;}.

{ find args 3>&1 1>&2 2>&3 3>&- | grep -Fv 'Permission denied'; } 3>&1 1>&2 2>&3 3>&-

덜 번거둜운 방법 : ν”„λ‘œμ„ΈμŠ€ λŒ€μ²΄

Ubuntu와 같은 GNU / Linux μ‹œμŠ€ν…œμ„ ν¬ν•¨ν•˜μ—¬μ΄λ₯Ό 지원할 μˆ˜μžˆλŠ” μ‹œμŠ€ν…œμ˜ Bashλ₯Ό ν¬ν•¨ν•œ 일뢀 μ…Έ 을 μ‚¬μš©ν•˜λ©΄ λͺ…령을 μ‹€ν–‰ν•˜κ³  ν•΄λ‹Ή 슀트림 쀑 ν•˜λ‚˜μ—μ„œ λ¦¬λ””λ ‰μ…˜ ν•  μˆ˜μžˆλŠ” ν”„λ‘œμ„ΈμŠ€ λŒ€μ²΄ λ₯Ό μˆ˜ν–‰ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 당신은 λ¦¬λ””λ ‰μ…˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ findA와 λͺ…λ Ήμ˜ ν‘œμ€€ 였λ₯˜ grepλ₯Ό 필터링 λͺ…λ Ή, κ·Έ λ¦¬λ””λ ‰μ…˜ grepν‘œμ€€ 였λ₯˜μ— λͺ…λ Ήμ˜ ν‘œμ€€ 좜λ ₯을.

find args 2> >(grep -Fv 'Permission denied' >&2)

ν¬λ ˆλ”§μ€ 이 아이디어 λ₯Ό μœ„ν•΄ Android Dev λ‘œκ°‘λ‹ˆλ‹€ .

ν”„λ‘œμ„ΈμŠ€ λŒ€μ²΄λ₯Ό bash 지원 ν•˜μ§€λ§Œ shUbuntu λŠ” dash그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. stdoutκ³Ό stderrλ₯Ό λ°”κΎΈλŠ” 방법은 μ—¬μ „νžˆ β€‹β€‹μž‘λ™ν•˜μ§€λ§Œμ΄ 방법을 μ‚¬μš©ν•˜λ €κ³ ν•˜λ©΄ β€œκ΅¬λ¬Έ 였λ₯˜ : λ¦¬λ””λ ‰μ…˜μ΄ 예기치 μ•Šκ²Œ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.” λ˜ν•œ POSIX λͺ¨λ“œbash μ—μ„œ μ‹€ν–‰ ν•˜λ©΄ ν”„λ‘œμ„ΈμŠ€ λŒ€μ²΄μ— λŒ€ν•œ 지원이 ν•΄μ œλ©λ‹ˆλ‹€.

bashPOSIX λͺ¨λ“œ μ—μ„œ μ‹€ν–‰λ˜λŠ” ν•œ 가지 상황 은 sh1 둜 호좜 될 λ•Œ μž…λ‹ˆλ‹€. λ”°λΌμ„œ Fedora와 같은 OSλ₯Ό bash제곡 /bin/shν•˜κ±°λ‚˜ Ubuntu μ—μ„œ /bin/sh심볼릭 링크 포인트λ₯Ό μ„€μ • ν•œ 경우 POSIX λͺ¨λ“œλ₯Ό ν•΄μ œν•˜λŠ” 사전 λͺ…령이 μ—†μœΌλ©΄ 슀크립트 bashμ—μ„œ ν”„λ‘œμ„ΈμŠ€ λŒ€μ²΄κ°€ μ—¬μ „νžˆ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ sh. 이 방법을 μŠ€ν¬λ¦½νŠΈμ— μ‚¬μš©ν•˜λ €λ©΄ κ°€μž₯ 쒋은 방법은 아직 μ•„λ‹Œ 경우 #!/bin/bash 맨 λŒ€μ‹  맨 μœ„μ— λ‘λŠ” κ²ƒμž…λ‹ˆλ‹€ #!/bin/sh.

1 :이 μƒν™©μ—μ„œλŠ” μ‹œμž‘ μŠ€ν¬λ¦½νŠΈμ—μ„œ λͺ…령을 μ‹€ν–‰ ν•œ ν›„bash POSIX λͺ¨λ“œλ₯Ό μžλ™μœΌλ‘œ μΌ­λ‹ˆλ‹€ .

예

μ΄λŸ¬ν•œ λͺ…령을 ν…ŒμŠ€νŠΈ ν•  수 있으면 μœ μš©ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ tmpν˜„μž¬ 디렉토리 의 μ„œλΈŒ 디렉토리λ₯Ό μž‘μ„±ν•˜κ³  일뢀 파일 및 λ””λ ‰ν† λ¦¬λ‘œ μ±„μš°κ³  β€œκΆŒν•œ κ±°λΆ€β€μ˜€λ₯˜λ₯Ό μœ λ°œν•˜λŠ” κΆŒν•œ 쀑 ν•˜λ‚˜λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€ find.

mkdir tmp; cd tmp; mkdir a b c; touch w a/x 'a/Permission denied messages.txt' b/y c/z; chmod 0 b

μ•‘μ„ΈμŠ€ κ°€λŠ₯ν•œ 디렉토리 쀑 ν•˜λ‚˜μ— 이름에 β€œPermission deniedβ€κ°€μžˆλŠ” 파일 이 μžˆμŠ΅λ‹ˆλ‹€. 경둜 find재 지정 λ˜λŠ” νŒŒμ΄ν”„μ—†μ΄ μ‹€ν–‰ ν•˜λ©΄μ΄ 파일이 ν‘œμ‹œλ˜μ§€λ§Œ μ•‘μ„ΈμŠ€ ν•  수 μ—†λŠ” λ‹€λ₯Έ 디렉토리에 λŒ€ν•œ μ‹€μ œ β€œPermission deniedβ€μ˜€λ₯˜λ„ ν‘œμ‹œλ©λ‹ˆλ‹€ .

ek@Io:~/tmp$ find
.
./a
./a/Permission denied messages.txt
./a/x
./c
./c/z
./w
./b
find: β€˜./b’: Permission denied

stdoutκ³Ό stderr을 λͺ¨λ‘ νŒŒμ΄ν”„ grepν•˜κ³  β€œPermission denied”가 포함 된 행을 ν•„ν„°λ§ν•˜λ©΄ 였λ₯˜ λ©”μ‹œμ§€κ°€ μ‚¬λΌμ§€μ§€λ§Œ ν•΄λ‹Ή λ¬Έκ΅¬κ°€μžˆλŠ” 파일의 검색 κ²°κ³ΌλŠ” μ΄λ¦„μ—μ„œ μˆ¨κ²¨μ§‘λ‹ˆλ‹€.

ek@Io:~/tmp$ find |& grep -Fv 'Permission denied'
.
./a
./a/x
./c
./c/z
./w
./b

find 2>&1 | grep -Fv 'Permission denied' λ™μΌν•˜κ³  λ™μΌν•œ 좜λ ₯을 μƒμ„±ν•©λ‹ˆλ‹€.

검색 κ²°κ³Όκ°€ μ•„λ‹Œ 였λ₯˜ λ©”μ‹œμ§€μ—μ„œλ§Œ β€œκΆŒν•œ 거뢀”λ₯Ό ν•„ν„°λ§ν•˜λŠ” 방법은 μ„±κ³΅μ μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, stdoutκ³Ό stderr이 κ΅μ²΄λ˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

ek@Io:~/tmp$ (find 3>&1 1>&2 2>&3 3>&- | grep -Fv 'Permission denied') 3>&1 1>&2 2>&3 3>&-
.
./a
./a/Permission denied messages.txt
./a/x
./c
./c/z
./w
./b

find args 2> >(grep -Fv 'Permission denied' >&2) λ™μΌν•œ 좜λ ₯을 μƒμ„±ν•©λ‹ˆλ‹€.

ν…μŠ€νŠΈ β€œPermission denied”가 포함 λ˜μ§€ μ•Šμ€ stderr둜 전솑 된 ν–‰ 이 계속 ν—ˆμš© λ˜λ„λ‘ λ‹€λ₯Έ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό 트리거 ν•  수 μžˆμŠ΅λ‹ˆλ‹€ . 예λ₯Ό λ“€μ–΄, μ—¬κΈ°μ„œλŠ” findν˜„μž¬ 디렉토리 ( .)λ₯Ό ν•˜λ‚˜μ˜ μ‹œμž‘μ μœΌλ‘œ μ‚¬μš©ν–ˆμ§€λ§Œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 디렉토리 fooλ₯Ό λ‹€λ₯Έ 곳으둜 μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

ek@Io:~/tmp$ (find . foo 3>&1 1>&2 2>&3 3>&- | grep -Fv 'Permission denied') 3>&1 1>&2 2>&3 3>&-
.
./a
./a/Permission denied messages.txt
./a/x
./c
./c/z
./w
./b
find: β€˜foo’: No such file or directory

그건 검사 find의 ν‘œμ€€ 좜λ ₯은 아직도 ν„°λ―Έλ„μž…λ‹ˆλ‹€

λ˜ν•œ κ°œν–‰κ³Ό 같은 특수 λ¬Έμžκ°€ 문자 적으둜 ν‘œμ‹œλ˜λŠ” λͺ…령을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. (μœ„μ˜ 데λͺ¨μ™€ λ³„λ„λ‘œ μˆ˜ν–‰ ν•  수 있으며 tmp디렉토리 μ—μžˆμ„ ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€ .)

이름에 κ°œν–‰μ„ 가진 νŒŒμΌμ„ λ§Œλ“œμ‹­μ‹œμ˜€ :

touch $'abc\ndef'

일반적으둜 디렉토리λ₯Ό μ‹œμž‘μ μœΌλ‘œ μ‚¬μš© findν•˜μ§€λ§Œ νŒŒμΌλ„ μž‘λ™ν•©λ‹ˆλ‹€.

$ find abc*
abc?def

stdout을 λ‹€λ₯Έ λͺ…λ ΉμœΌλ‘œ νŒŒμ΄ν”„ν•˜λ©΄ κ°œν–‰μ΄ 문자 κ·ΈλŒ€λ‘œ 좜λ ₯λ˜μ–΄ 두 개의 κ°œλ³„ 검색 κ²°κ³Ό abc와 의 잘λͺ»λœ 인상을 λ§Œλ“­λ‹ˆλ‹€ def. μš°λ¦¬λŠ” 그것을 ν…ŒμŠ€νŠΈ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ cat:

$ find abc* | cat
abc
def

stderr 만 λ¦¬λ””λ ‰μ…˜ν•˜λ©΄μ΄ λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

$ find abc* 2>/dev/null
abc?def

λ‹«λŠ” 것도 μ•„λ‹™λ‹ˆλ‹€.

$ find abc* 2>&-
abc?def

νŒŒμ΄ν•‘ ν•˜λ©΄ 문제 grep κ°€ λ°œμƒν•©λ‹ˆλ‹€.

$ find abc* |& grep -Fv 'Permission denied'
abc
def

(둜 ꡐ체 |&ν•˜λŠ” 2>&1 |것은 λ™μΌν•˜λ©° λ™μΌν•œ 좜λ ₯을 μƒμ„±ν•©λ‹ˆλ‹€.)

ν‘œμ€€ 좜λ ₯κ³Ό ν‘œμ€€ μ—λŸ¬λ₯Ό κ΅ν™˜ ν‘œμ€€ 좜λ ₯을 νŒŒμ΄ν”„ μˆ˜ν–‰ ν•˜μ§€ problem- 원인 find의 ν‘œμ€€ 좜λ ₯μ΄λ©λ‹ˆλ‹€ 열렀진,ν•˜κ²Œ ν•˜μ§€ νŒŒμ΄ν”„λ₯Ό :

$ find abc* 3>&1 1>&2 2>&3 3>&- | grep -Fv 'Permission denied'
abc?def

ν•΄λ‹Ή λͺ…령을 κ·Έλ£Ήν™”ν•˜κ³  μŠ€νŠΈλ¦Όμ„ λ‹€μ‹œ κ΅ν™˜ν•΄λ„ λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

$ (find abc* 3>&1 1>&2 2>&3 3>&- | grep -Fv 'Permission denied') 3>&1 1>&2 2>&3 3>&-
abc?def

( { ;}버전은 λ™μΌν•œ 좜λ ₯을 μƒμ„±ν•©λ‹ˆλ‹€.)

ν”„λ‘œμ„ΈμŠ€ λŒ€μ²΄λ₯Ό μ‚¬μš©ν•˜μ—¬ stderr을 필터링해도 λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

$ find abc* 2> >(grep -Fv 'Permission denied' >&2)
abc?def

λ‹΅λ³€