알 수 없는 확장자에 대해 확장자가 없는 파일 이름에 대한 Linux find 명령

알 수 없는 확장자에 대해 확장자가 없는 파일 이름에 대한 Linux find 명령

나는 다음 명령을 사용하여 파일 이름을 인쇄하는 것을 좋아하지만 확장명을 사용하여 인쇄합니다.

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 '*.*': 확장자를 포함한 파일 이름

관련 정보