인코딩할 비디오 파일이 있고 출력을 로컬 디렉터리에 저장하여 파일 이름을 source/
제거하고 싶습니다 .source/
Fish 셸에서 다음 명령을 사용하여 이 작업을 수행했습니다.
$ for file in source/*.mkv
ffmpeg -i "$file" -c:v copy -c:a copy (echo "$file" | sed -e "s/source\///")
end
echo
파이핑 출력이 약간 조잡하다고 생각하지만 sed
로컬 변수의 문자열만 처리하는 함수가 있습니까? 와 비슷 sed
하지만 지역 변수나 파일 이름에만 적용됩니다.
답변1
여기 문자열에서 디렉터리 이름을 제거(수정)하려고 합니다.
표준 쉘에서는 다음을 사용할 수 있습니다.${parameter#pattern}
확장pattern
, 문자열의 시작 부분에서 제거되어 접두사 가 제거 parameter
됩니다 .${file#source/}
source/
또한 ksh/Bash/zsh에서는 ${parameter/pattern}
문자열의 어느 위치에서나 일치하는 항목이 제거되어 sed와 s/pattern//
더 밀접하게 일치합니다. ( ${..//..}
모든 일치 항목 제거). 그것들패턴은 파일 이름 와일드카드에 사용된 패턴과 동일합니다.;정규식이 아닙니다.
에는 fish
있습니다내장 string replace
명령, 여기에서 작동하는 것 같습니다.
> set f source/foobar
> string replace source/ "" -- $f
foobar
또는 -r
정규식을 사용하면 경로를 알 필요가 없습니다.
> string replace -r "^.*/" "" -- $f
foobar
(저는 생선에 대해 잘 알지 못하므로 참고하시기 바랍니다. 위의 방법은 효과가 있는 것 같지만, 어떤 코너에서는 무너질지는 잘 모르겠습니다.)
답변2
당신이 찾고있는 basename
:
ffmpeg -i $file -c:v copy -c:a copy (basename $file)