기본 이름은 같지만 확장자가 다른 파일 찾기

기본 이름은 같지만 확장자가 다른 파일 찾기

디렉토리에서 기본 이름은 같지만 확장자가 다른 모든 파일을 찾는 방법은 무엇입니까? 예를 들어 0001.jpgand 0001.png및 및 0001.tiff0002.jpg0002.png.

답변1

모든 고유한 파일 이름을 원하면 다음을 수행하십시오.

ls -1 | sed 's/\([^.]*\).*/\1/' | uniq

이러한 파일 중 둘 이상을 동일한 기본 이름으로 지정하려면 다음을 사용하세요.

ls -1 | sed 's/\([^.]*\).*/\1/' | uniq -c | sort -n | egrep -v "^ *\<1\>"

마침표가 여러 개인 파일 이름의 경우 다음 명령을 사용하십시오.

ls -1 | sed 's/\(.*\)\..*/\1/' | uniq -c | sort -n | egrep -v "^ *\<1\>"

답변2

솔루션 활용ls( 출력 구문 분석을 피하고 있으며 이 작업을 위해 설계되지 않았으며 오류가 발생할 수 있습니다):

perl -E '
    while (<*>){
        ($full, $short) = (m/^((.*?)\..*)$/);
        next unless $short;
        push @{ $h->{$short} }, $full;
    }
    for $key (keys %$h) {
        say join " ", @{ $h->{$key} } if @{ $h->{$key} } > 1;
    }
' /home/sputnick

또는 원하는 디렉토리 /home/sputnick로 바꾸십시오 .).

답변3

여기서 유일한 답변은 sedOR perl또는 정규 표현식을 사용하기 때문에 저는 좀 더 간단할 수 있는 내용을 게시할 것이라고 생각했습니다.

for file in /path/to/your/files/*; do echo ${file%%.*}; done | uniq -d

이 예에서는 ${file%%.*}파일 경로가 첫 번째 마침표( .)와 일치합니다. 그러므로 0001.tar.gz고려될 것이다 0001.

출력은 다음과 같습니다

/path/to/your/files/0001
/path/to/your/files/0002

전체 경로가 출력에 표시되지 않도록 하려면 cd먼저 디렉터리로 이동한 다음 별표( *)만 경로로 사용하여 명령을 실행하세요.

cd /path/to/your/files
for file in *; do echo ${file%%.*}; done | uniq -d

그러면 출력은 다음과 같습니다.

0001
0002

답변4

구문 분석을 두려워하지 않는 경우 ls:

/bin/ls --color=no -1 | sed 's/\.[^.]*$//' | uniq -d

파일 이름에 새 줄이 포함되어 있으면 실패합니다.

관련 정보