나는 하나의 키 바인딩을 통해 필요한 모든 파일을 얻는 것을 좋아합니다. 현재 나는 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
전체적으로 건너뛰며 동시에 표시되지도 않습니다. 이는 여전히 인쇄하고 그 안에 있는 디렉터리와 디렉터리를 찾는 첫 번째 명령과 비교할 때 다릅니다..thunderbird
python3.8
find
find
.thunderbird
python3.8
-maxdepth 1
깊이 1( 세 번째 명령과 마찬가지로) 에서 파일을 보고할 수 있도록 /.
검색 디렉터리에 추가하고 일치하는 경로 */./*/*
(2개 이상의 수준 아래 /./
)가 있는 파일을 제외합니다. 그러나 이는 경로가 로 인쇄된다는 것을 의미합니다 /home/you/./file.txt
. 이것이 마음에 들지 않으면 /./
언제든지 출력을 파이핑하여 제거할 수 있습니다 | sed 's|/\./||;1s|/\.$//'
.
귀하의 콘텐츠는 어쨌든 일치하지 않으므로 ! -iname index.txt
중복됩니다 . 또한 쉘이 따옴표를 확장할 수 있다는 사실 도 잊어버리고 있습니다 .index.txt
-iname \*.Rmd -o -iname \*.el
*/.git/*
개행 문자가 포함된 파일 경로에서도 작동하도록 -print
with -print0
및 using 으로 바꿀 수도 있습니다 .fzf --read0