![linux find 명령은 확장자 없이 알 수 없는 확장자를 가진 파일 이름을 찾습니다.](https://linux55.com/image/146784/linux%20find%20%EB%AA%85%EB%A0%B9%EC%9D%80%20%ED%99%95%EC%9E%A5%EC%9E%90%20%EC%97%86%EC%9D%B4%20%EC%95%8C%20%EC%88%98%20%EC%97%86%EB%8A%94%20%ED%99%95%EC%9E%A5%EC%9E%90%EB%A5%BC%20%EA%B0%80%EC%A7%84%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%B0%BE%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
다음 명령을 사용하여 파일 이름을 인쇄하고 싶지만 확장명이 포함된 파일 이름이 인쇄됩니다.
find . -type f -printf '%f\n'
내 디렉토리에는 확장자가 다른 파일이 많이 있습니다. --ignore='*.*'
전후에 추가를 시도했지만 -printf
성공하지 못했습니다. 예: myfile1.txt, myfile2.mp3 등의 파일이 있습니다. myfile1, myfile2 등을 인쇄하려면 필요합니다. 어떻게 해야 합니까?
답변1
내가 올바르게 이해했다면 (아니요. 답변의 두 번째 부분을 참조하세요.), 점 문자가 포함된 파일 이름을 나열하지 않으려고 합니다.
이렇게 하면 됩니다:
find . -type f ! -name '*.*'
파일 이름 와일드카드 패턴은 *.*
점이 하나 이상 포함된 모든 파일 이름과 일치합니다. 위의 내용은 !
일치의 의미를 무효화합니다. 즉, 끝에 도달한 경로 이름은 이름에 점이 없는 파일의 경로 이름이 됩니다. 존재하다정말 늙었어!
쉘 에서 탈출 \!
(또는 Unix 설치 업데이트)을 원할 수도 있습니다 . 외로운 사람은 !
전화하지 마세요bash
역사적인 확장 시설.
GNU를 사용하여 발견된 경로 이름의 파일 이름 부분만 인쇄하십시오 find
.
find . -type f ! -name '*.*' -printf '%f\n'
표준 find
(또는 GNU find
)의 경우:
find . -type f ! -name '*.*' -exec basename {} \;
루프 내에서 명령 대체에 사용하기 전에 "찾기 결과를 반복하는 것이 왜 나쁜 습관입니까?".
이름의 마지막 점 뒤의 모든 항목을 제거하면서 모든 파일 이름을 나열하려면("확장자 제거") 다음을 사용할 수 있습니다.
find . -type f -exec sh -c '
for pathname do
pathname=$( basename "$pathname" )
printf "%s\n" "${pathname%.*}"
done' sh {} +
이는 모든 파일에 대해 발견된 모든 경로 이름을 짧은 쉘 루프로 보냅니다. 이 루프는 각 경로명을 가져와 호출하여 basename
경로명의 파일명 부분을 추출한 다음 마지막 점 뒤의 모든 항목이 제거된 결과 문자열을 인쇄합니다.
매개변수 확장은 " ${pathname%.*}
값 끝에서 가장 짧은 문자열 일치(텍스트 뒤에 오는 리터럴 포인트) 제거"를 의미합니다. 파일 이름의 마지막 점 뒤의 파일 이름 접미사를 제거하는 효과가 있습니다..*
$pathname
자세한 내용은 find ... -exec ... {} +
""find"의 -exec 옵션 이해".
답변2
Linux에는 파일 확장자 같은 것이 없습니다. 파일 이름의 A는 의미 .
가 없습니다..
첫 번째숨겨진 파일로 식별하는 파일 이름의 문자).
또한 내 시스템의 매뉴얼 페이지를 확인해도 옵션이 find
표시되지 않습니다 .--ignore
.
즉, 이름에 a가 포함된 파일을 무시하려면 find
' -not
연산자를 사용할 수 있습니다.
find -type f -not -name '*.*' -print
답변3
다른 사람들이 지적했듯이 "확장"은 Unix 시스템에서 아무 의미도 없습니다. 그러나 간단한 명령을 사용하여 목록에서 해당 항목을 제거할 수 있습니다 sed
.
예를 들어
find * -type f -print | sed 's/\.[^.]*$//'
디렉토리가 있고 목록에 표시되지 않도록 하려면 다음을 수행하십시오.
find * -type f -printf "%f\n" | sed 's/\.[^.]*$//'
단일 디렉토리의 경우 ls
대신 사용할 수 있습니다find
ls | sed 's/\.[^.]*$//'
답변4
노력하다
find . -type f \! -name '*.*' -print
어디
\!
: 그렇지 않습니다(!를 이스케이프해야 함)name '*.*'
: 확장자를 포함한 파일 이름