
나는 다음 명령을 사용하여 파일 이름을 인쇄하는 것을 좋아하지만 확장명을 사용하여 인쇄합니다.
find . -type f -printf '%f\n'
내 디렉토리에는 확장자가 다른 파일이 많이 있습니다. --ignore='*.*'
before와 after를 모두 추가하려고 시도했지만 -printf
작동하지 않았습니다. 예; myfile1.txt, myfile2.mp3 등의 파일이 있습니다. myfile1, myfile2 등을 인쇄해야 합니다. 어떻게 해야 합니까?
답변1
내가 당신을 올바르게 이해한다면 (그렇지 않았습니다. 답변의 두 번째 부분을 참조하세요.), 점 문자가 포함된 파일 이름을 나열하지 않으려고 합니다.
이렇게 하면 됩니다:
find . -type f ! -name '*.*'
파일 이름 글로빙 패턴은 *.*
점이 하나 이상 포함된 모든 파일 이름과 일치합니다. 앞의 !
내용은 일치 의미를 무효화합니다. 즉, 끝까지 통과하는 경로 이름은 이름에 점이 없는 파일의 경로 이름이 됩니다. ~ 안에정말 고대!
쉘의 경우 as를 이스케이프 처리 \!
하거나 Unix 설치를 업데이트할 수 있습니다. 고독한 사람은 !
호출하지 않습니다bash
의 역사 확장 시설.
GNU를 사용하여 찾은 경로 이름의 파일 이름 구성 요소만 인쇄하려면 다음을 수행하십시오 find
.
find . -type f ! -name '*.*' -printf '%f\n'
표준 find
(또는 GNU find
)의 경우:
find . -type f ! -name '*.*' -exec basename {} \;
루프의 명령 대체에서 이것을 사용하기 전에 "find의 출력을 반복하는 것이 왜 나쁜 습관입니까?".
모든 파일 이름을 나열하고 동시에 이름의 마지막 점 뒤의 모든 항목을 제거하려면("확장자 제거") 다음을 사용할 수 있습니다.
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는 아무런 의미가 없습니다(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 '*.*'
: 확장자를 포함한 파일 이름