다음과 같은 링크가 포함된 파일이 있습니다.
http://domain.com/file_name1.mkv
http://domain.com/file_name2.mkv
http://domain.com/file_name3.mkv
... 등.
각 링크에 대해 .strm 확장자를 가진 파일을 만들고 각 파일에 파일 이름을 갖고 해당 파일에 대한 링크를 포함하고 싶습니다. 따라서 첫 번째 링크의 경우 첫 번째 파일 이름은 file_name1.strm이 되고 첫 번째 링크를 포함하고, 두 번째 링크의 경우 파일 이름은 file_name2.strm이 되며 두 번째 링크를 포함하는 식입니다. 어떻게 해야 하나요?
가까운 작업을 수행하는 명령이 있지만 파일에 있는 단어 이름으로만 파일을 생성합니다.
sed -e 's/$/.strm/' file | xargs -d '\n' touch
답변1
xargs
시도를 자세히 설명해주세요.
xargs -L1 sh -c 'f="${0##*/}"; printf "%s\n" "$0" > "${f%.*}.strm"' < file
첫 번째 대체는 f="${0##*/}"
URL의 경로 구성 요소를 제거하고 두 번째 대체는 "${f%.*}.strm"
확장자를 제거하고 대체합니다.
전임자.
$ xargs -L1 sh -c 'f=${0##*/}; printf "%s\n" "$0" > "${f%.*}.strm"' < file
$ head *.strm
==> file_name1.strm <==
http://domain.com/file_name1.mkv
==> file_name2.strm <==
http://domain.com/file_name2.mkv
==> file_name3.strm <==
http://domain.com/file_name3.mkv
답변2
@Erwan이 제안한 순수한 bash 솔루션으로 되돌리려고 노력할 것입니다.
while IFS= read -r link; do
filename="${link##*/}"
echo "$link" > "${filename%.mkv}.strm"
done < file
- 바라보다https://unix.stackexchange.com/a/209184/230365
IFS= read -r
한 줄을 읽을 때 왜 사용해야 하는지 설명하세요. ${var##<pattern>}
변수를 제거된 가장 긴 접두사 일치로 바꾸십시오. bash(1)의 "매개변수 확장" 섹션에서 "일치하는 접두사 패턴 제거"를 참조하세요. 다른 유용한 매개변수 확장 수정자가 많이 있습니다.${var%<pattern>}
제거된 가장 짧은 접미사와 일치하는 변수로 교체("일치하는 접미사 패턴 제거")
답변3
의견에 언급된 버그를 수정하기 위해 편집되었지만 Belka의 답변은 더 나은 솔루션 버전입니다.
아래 file
링크를 한줄씩 읽어보세요 . 각 링크는 링크의 기본 이름과 원하는 끝이 붙은 이름의 파일에 기록됩니다.
while read link; do
echo "$link" >$(basename "${link%.mkv}").strm
done <file
단일 안감과 동일:
cat file | while read link; do echo "$link" >$(basename "${link%.mkv}").strm; done