.gitignore와 같은 패턴에 해당하는 모든 파일을 찾는 방법

.gitignore와 같은 패턴에 해당하는 모든 파일을 찾는 방법

예를 들어. 와 같은 파일이 있습니다 .myignore. 해당 파일에는 다음과 같은 문자열이 있습니다.

.vs/
*.suo
*.user
*.log

그런 다음 file 의 패턴과 일치하는 모든 파일을 찾고 싶습니다 .myignore.

답변1

존재하다 zsh:

() {print -rC1 -- ${(u)@}} ${~^${(f)"$(<.gitignore)"}}(ND)

어디:

  • () {body} args매개변수가 포함된 익명 함수 호출입니다.
  • print -rC1 -- ${(u)@}함수 본문으로서 열에 print고유한 인수를 표시합니다 (플래그는 중복 항목을 제거함). 이러한 파일/디렉토리를 삭제하려면 로 바꾸십시오.r1 Cuuprint -rC1rm -rf
  • "$(<.gitignore)".gitignore후행 개행 문자(있는 경우)를 제외한 내용으로 확장됩니다. 따옴표는 IFS 분할을 방지하기 위한 것입니다.
  • ${(f)param}매개변수 확장을 줄 번호 f(개행이라고도 함)로 분할합니다.
  • ${~param}결과 단어의 와일드카드를 허용합니다.
  • ${^array}textrc 또는 fish와 같은 방식으로 배열을 확장합니다. 예를 들어 가 $array포함된 경우 대신 으로 확장됩니다 .ABAtext BtextA Btext
  • (ND)숨겨진 파일을 건너뛰지 않고 일치 실패로 인해 오류가 발생하지 않도록 한정자를 [N]ullglob추가 합니다 .[D]otglob

답변2

줄 바꿈으로 설정된 배열을 사용하십시오 IFS.

# save IFS variable
OLD_IFS=$IFS

# Set IFS to newline only
IFS=$'\n'

# Expand the files to an array.
files=($(<.myignore))

# reset IFS to old value
IFS=$OLD_IFS

# delete your files (remove the echo if the output is ok)
# ... or do other stuff
echo rm -f "${files[@]}"

답변3

간단히 명령 대체를 통해 쉘 확장을 허용할 수 있습니다.

echo $(cat .myignore)
ls -ld $(cat .myignore)
rm -rf $(cat .myignore)

관련 정보