![기본 이름은 같지만 확장자가 다른 파일 찾기](https://linux55.com/image/59521/%EA%B8%B0%EB%B3%B8%20%EC%9D%B4%EB%A6%84%EC%9D%80%20%EA%B0%99%EC%A7%80%EB%A7%8C%20%ED%99%95%EC%9E%A5%EC%9E%90%EA%B0%80%20%EB%8B%A4%EB%A5%B8%20%ED%8C%8C%EC%9D%BC%20%EC%B0%BE%EA%B8%B0.png)
디렉토리에서 기본 이름은 같지만 확장자가 다른 모든 파일을 찾는 방법은 무엇입니까? 예를 들어 0001.jpg
and 0001.png
및 및 0001.tiff
및 0002.jpg
및 0002.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
여기서 유일한 답변은 sed
OR 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
파일 이름에 새 줄이 포함되어 있으면 실패합니다.