이 목록이 포함된 제공된 텍스트 파일을 기반으로 공백(확장자 무시)을 포함할 수 있는 파일을 찾습니다.

이 목록이 포함된 제공된 텍스트 파일을 기반으로 공백(확장자 무시)을 포함할 수 있는 파일을 찾습니다.

Linux 도구에 대한 지식이 부족하여 어려움을 겪고 있습니다. 내 파일 목록에 공백(공백 문자)이 포함되어 있으므로 "find" 명령은 히트 항목을 찾을 수 없지만 오류를 생성하지 않습니다. 이 스크립트를 사용하는 이유는 음악이나 영화와 같이 이전에 트랜스코딩된 파일을 (재)트랜스코딩하는 데 도움을 주기 위한 것입니다.

searchdir="/volume2/"
filename='list-in.txt'

n=1

while read line; do

echo "# $n : $line"
FILES=${line%.*}

find ${searchDir} -iname "$FILES.*" -type f

n=$((n+1))

done < $filename

변수 처리를 다루는 awk 또는 sed 예제가 거의 없다는 것을 알았기 때문에 여기서부터 시작해야 할지 모르겠습니다.

입력 파일에는 다음 형식의 파일 이름이 포함됩니다.

Supertramp [The Very Best Of Supertramp] -05- Breakfast In America.m4a
Supertramp [The Very Best Of Supertramp] -07- Take The Long Way Home.m4a
Supertramp [The Very Best Of Supertramp] -09- Dreamer.m4a

따옴표 구분 기호나 경로가 없습니다.

스크립트의 출력은 위 목록과 가장 잘 일치하는 경로와 파일 이름이 됩니다. 소스 파일과 결과 파일의 파일 확장자는 다릅니다.

/volume2/music/Supertramp/1990. The Very Best Of Supertramp/Supertramp [The Very Best Of Supertramp] -05- Breakfast In America.flac
/volume2/music/Supertramp/1990. The Very Best Of Supertramp/Supertramp [The Very Best Of Supertramp] -07- Take The Long Way Home.flac
/volume2/music/Supertramp/1990. The Very Best Of Supertramp/Supertramp [The Very Best Of Supertramp] -09- Dreamer.flac

답변1

zsh 쉘 사용:

set -o extendedglob

searchdir=/volume2
filename=list-in.txt
names=( ${(f)"$(<$filename)"} )
files=( $searchdir/**/(#i)(${(~j[|])names:r}).*(ND.) )
print -rC1 -- $files

여기에서 대소문자를 구분하지 않는 일치를 활성화하는 것 외에도 (#i)대략적인 일치를 활성화할 수도 있습니다. 예를 들어, (#a2)최대 2개의 오류(생략, 삽입, 전치, 다른 문자)까지 일치가 허용됩니다.

  • $(<file)확장된 콘텐츠 file. IFS가 불평하는 것을 방지하기 위해 여기에 인용되었습니다.
  • ${(f)expansion}라인에서 확장을 분할합니다 f.
  • ${file:r}r파일의 ootname 으로 확장됩니다 (확장자는 제거됨). 배열에 적용하면 모든 요소에 적용됩니다.
  • ${(j[|])array} j배열 요소를 추가하는 데 사용됩니다 |. 의 경우 전역 연산자(교대)로 처리됩니다 ~.|
  • **/하위 디렉터리의 모든 수준(수준 0 포함)과 일치합니다.
  • (ND.): 글로벌 한정자:
  • Nullglob: 일치하는 항목이 없으면 오류 없음
  • Dotglob: 숨겨진 파일도 찾습니다.
  • .일치만정기적인파일(예: -type f) find.

관련 정보