나는 이미지를 독점 이미지 형식으로 저장하는 특수 디지털 카메라를 구입했습니다 .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