나는 find
파일 목록을 가져온 다음 경로 일치를 위해 grep을 사용했습니다.
$ find pc* | grep -i arthur
pc6/arthurv/untitled-2.py
pc6/arthurv/untitled-3.py
pc6/arthur.py
pc9/Arthur 4C
pc9/Arthur 4C/untitled-1.py
pc9/Arthur 4C/untitled-2.py
나는 이것을 하고 ls -F
각 디렉토리에 하나씩 추가하고 싶습니다./
또는 일치하는 모든 대소문자를 구분하지 않고 표시하는 디렉토리를 어떻게 찾을 수 있습니까 arthur
?
답변1
find
GNU로 조건부 처리를 구현하기 위해 표현식에 논리합을 사용할 수 있습니다 find
.
find pc* -type d -printf "%p/\n" -o -print
"pc*"와 일치하는 파일 및 디렉터리로 시작하는 경로에서 모든 항목을 찾아 해당 이름을 인쇄하고 디렉터리인 경우 "/"가 표시됩니다.
작동 방식은 다음과 같습니다.
pc*
시작 경로를 지정하십시오.-type d
일치 디렉토리;-printf "%p/\n"
현재 처리된 파일의 경로를 인쇄하고 그 뒤에 "/"와 개행 문자가 따르므로-type d
일치하는 경우에만 실행됩니다-type d
(암시적 접속사가 있음).-o
논리합 소개: 앞의 표현이 일치하지 않으면 그 뒤의 표현이 평가됩니다(-type d -printf "%p/\n"
접속이 논리합보다 우선순위가 높기 때문에 앞에 나오는 표현이 여기에 있습니다).-print
현재 처리 중인 파일의 경로를 출력합니다.
추가 find
표현식을 사용하여 대소문자를 구분하지 않는 "arthur"와 일치하는 모든 디렉토리를 표시할 수 있습니다.
find . -type d -iname "*arthur*"
답변2
find
수많은 옵션과 세부 정보가 있습니다. 또 다른 변형은 다음을 -printf
사용하는 것 입니다.%y
$ find . -printf "%p:%y\n"
./dir:d
./file:f
여기서 %y
"d" 또는 "f"를 추가하는 것은 다음과 같습니다.ls -l
$ find . -printf "%p%y\n" | sed 's!d$!/! ; s!f$!!'
답변3
모든 파일과 디렉터리를 나열하려면 여기에 답변을 추가하세요.
cat <(find old.files -type d -printf "%p/\n") <(find old.files -type f)
산출:
dir1/dir2/
dir1/test.txt
dir1/dir2/test2.txt
뒤에 슬래시가 없는 이전 질문 dir1/dir2
:
dir1/dir2
dir1/test.txt
dir1/dir2/test2.txt
궁극적으로 tar 파일과 디렉터리를 비교할 수 있다는 것입니다.
diff <(tar tf old.files.tar | sort -u) <(cat <(find old.files -type d -printf "%p/\n") <(find old.files -type f) | sort -u)