이 세 가지 찾기 명령을 하나로 결합하려면 어떻게 해야 합니까?

이 세 가지 찾기 명령을 하나로 결합하려면 어떻게 해야 합니까?

나는 하나의 키 바인딩을 통해 필요한 모든 파일을 얻는 것을 좋아합니다. 현재 나는 fzf에 파이프하는 세 가지 find 명령을 포함하는 쉘 스크립트를 가지고 있습니다. 그러나 여러 가지 이유로 이를 단일 명령으로 결합해야 합니다(특히 현재 접근 방식이 보기 흉하고 결함이 확실하기 때문에).

find ~  \! \( -path */.git/* \) -type d

find ~  \(  -iname \*.Rmd -o -iname \*.el \)  -a \! \( -iname index.txt  -o -path */.thunderbird/* -o -path */python3.8/*  -o -path */.git/* \) -type f

find ~ -regextype posix-extended \( -not  -regex ".*/\.sw(o|p)" -a -not -regex ".*\~$"  \)   -maxdepth 1 -type f

누구든지 내 추악한 find 명령을 비판하고 파일 확장자를 화이트리스트/블랙리스트에 추가하는 보다 효율적이고 깔끔한 방법을 제안하고 싶다면 감사하겠습니다.

편집하다 명령이 수행하는 작업을 더 쉽게 이해할 수 있도록 명령을 단순화했습니다.

  • 첫 번째 명령은 홈 경로 아래에서 디렉터리를 찾지 만 해당 디렉터리와 해당 하위 디렉터리는 ~제외합니다 ..git
  • 두 번째 명령은 홈 디렉터리에서 파일을 찾고 화이트리스트 파일 확장자를 지정한 다음 블랙리스트 파일 확장자와 경로를 지정합니다.
  • 세 번째는 내 홈 디렉터리에서 도트 파일을 찾지 ~만 특정 정규식은 제외합니다.

답변1

아마도:

LC_ALL=C find ~/.                 \
  '('                             \
     -name .git -o                \
     -name .thunderbird -o        \
     -name python3.8              \
  ')' -prune -o                   \
  '('                             \
     -type d -o                   \
     '('                          \
        -name '*.[rR][mM][dD]' -o \
        -name '*.[eE][lL]' -o     \
          ! -path '*/./*/*'       \
          ! -name '.sw[op]'       \
          ! -name '*~'            \
     ')'                          \
     -type f                      \
  ')' -print

(여기서는 표준 구문 이 find사용됩니다( 모두 GNU 확장인 -regex, -regex-type, -iname, -maxdepth, 제외 ).-not-maxdepth

-prune// 모든 디렉토리 는 .git전체적으로 건너뛰며 동시에 표시되지도 않습니다. 이는 여전히 인쇄하고 그 안에 있는 디렉터리와 디렉터리를 찾는 첫 번째 명령과 비교할 때 다릅니다..thunderbirdpython3.8findfind.thunderbirdpython3.8

-maxdepth 1깊이 1( 세 번째 명령과 마찬가지로) 에서 파일을 보고할 수 있도록 /.검색 디렉터리에 추가하고 일치하는 경로 */./*/*(2개 이상의 수준 아래 /./)가 있는 파일을 제외합니다. 그러나 이는 경로가 로 인쇄된다는 것을 의미합니다 /home/you/./file.txt. 이것이 마음에 들지 않으면 /./언제든지 출력을 파이핑하여 제거할 수 있습니다 | sed 's|/\./||;1s|/\.$//'.

귀하의 콘텐츠는 어쨌든 일치하지 않으므로 ! -iname index.txt중복됩니다 . 또한 쉘이 따옴표를 확장할 수 있다는 사실 도 잊어버리고 있습니다 .index.txt-iname \*.Rmd -o -iname \*.el*/.git/*

개행 문자가 포함된 파일 경로에서도 작동하도록 -printwith -print0및 using 으로 바꿀 수도 있습니다 .fzf --read0

관련 정보