다른 확장자와 일치하지 않는 하나의 확장자를 가진 파일 이름 찾기

다른 확장자와 일치하지 않는 하나의 확장자를 가진 파일 이름 찾기

나는 이미지를 독점 이미지 형식으로 저장하는 특수 디지털 카메라를 구입했습니다 .lri. 회사에는 .lri 파일을 표준 jpg 및 dng 파일로 렌더링할 수 있는 데스크톱 프로그램이 있습니다.

이 파일이 저장된 디렉토리를 살펴보니 일부 파일 변환이 누락된 것을 발견했습니다. 그러나 누락된 파일 쌍, 파일 번호 및 중첩된 디렉터리 구조를 시각적으로 확인할 수 있었기 때문에 변환하려는 모든 파일을 확실히 찾기가 어려웠습니다.

.lri일치하는 파일 이름이 없을 때 확장자를 가진 파일을 찾기 위한 쉘 명령을 찾고 있습니다 .dng(현재 jpg 파일은 걱정하지 않습니다). 예를 들어, 내가 몇 달 또는 몇 년 전에 부지런히 일했다면 L16_04198.lri그랬어야 했습니다.L16_04198.dng

편집하다제가 언급하지 않은 두 가지 제한 사항은 파일이 중첩된 디렉터리 구조에 있으므로 재귀 검색이 필요하다는 것입니다. 또한 내 디렉토리 이름에는 공백이 포함되어 있으므로 이를 처리할 수 있어야 합니다.

L16_04198.lri따라서 중첩된 하위 디렉터리 구조에서 파일 이름을 찾을 수 없는 경우 파일 이름을 나에게 보고하는 명령이나 스크립트가 필요합니다 L16_04198.dng(파일을 렌더링했지만 잘못된 하위 디렉터리에 넣었을 수 있음).

명령 에 익숙 find하지만 "비" 파일 이름을 찾고 찾지 못한 경우 보고하는 방법을 잘 모르겠습니다.

답변1

다음을 시도해 볼 수 있습니다.

shopt -s globstar
for f in **/*.lri; do 
  [[ ! $(find . -name "$(basename "${f%%.lri}").dng") ]] && realpath "$f"
done

답변2

간단히 말해서:

find . -name "*.txt" | perl -nle 's/\.txt$/.foo/; print unless -e' | cat -v

Perl을 사용한 예는 다음과 같습니다.

c.foo가 누락되었습니다.

$ ls
a.foo  a.txt  b.foo  b.txt  c.txt

우리는 이것을 이렇게 찾을 수 있습니다

$ ls *.txt | perl -nle 's/\.txt$/.foo/; print unless -e '
c.foo

c.foo가 누락되었습니다


업데이트: 메타 문자 등이 포함된 파일 이름 처리

공백, 줄 바꿈 및 파이프 기호가 포함된 파일 이름 집합을 고려하세요.

$ ls *txt
 a.txt   b.txt   c.txt  'd d.txt'  'e'$'\r''e.txt'  'f'$'\n''f.txt'  'g|g.txt'   taskmaster.txt

사실 Perl은 ls의 출력을 구문 분석하는 데 아무런 문제가 없는 것 같습니다.

$ ls *txt | perl -nle 's/\.txt$/.foo/; print unless -e'
c.foo
d d.foo
e.foo
f
f.foo
g|g.foo
taskmaster.foo

분명히 파일 이름에 제어 문자가 포함되어 있으면 더 명확하게 만들고 싶을 수도 있습니다.

$ ls *txt | perl -nle 's/\.txt$/.foo/; print unless -e' | cat -v
c.foo
d d.foo
e^Me.foo
f
f.foo
g|g.foo
taskmaster.foo

재귀적으로 작동하길 원한다면

$ find . -name "*.txt" | perl -nle 's/\.txt$/.foo/; print unless -e' | cat -v
./c.foo
./d d.foo
./e^Me.foo
./f
f.foo
./g|g.foo
./h*h.foo
./temp/j.foo

관련 정보