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.)
: 글로벌 한정자:N
ullglob: 일치하는 항목이 없으면 오류 없음D
otglob: 숨겨진 파일도 찾습니다..
일치만정기적인파일(예:-type f
)find
.