목록의 각 링크에서 텍스트 파일을 생성하시겠습니까?

목록의 각 링크에서 텍스트 파일을 생성하시겠습니까?

다음과 같은 링크가 포함된 파일이 있습니다.

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
  1. 바라보다https://unix.stackexchange.com/a/209184/230365IFS= read -r한 줄을 읽을 때 왜 사용해야 하는지 설명하세요.
  2. ${var##<pattern>}변수를 제거된 가장 긴 접두사 일치로 바꾸십시오. bash(1)의 "매개변수 확장" 섹션에서 "일치하는 접두사 패턴 제거"를 참조하세요. 다른 유용한 매개변수 확장 수정자가 많이 있습니다.
  3. ${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

관련 정보