sed /PATTERN/SUB/ $VAR?

sed /PATTERN/SUB/ $VAR?

일부 파일의 이름을 바꾸는 중입니다.

이것은 작동합니다:
ls | while IFS= read -r line; do name=$(echo $line | sed -e 's/\(.*\)/\1.jpg/') && mv $line $name; done

괜찮습니다. 하지만 다음과 같이 좀 더 간결하게 만들고 싶습니다.
ls | while IFS= read -r line; do name=$(sed -e 's/\(.*\)/\1.jpg/' $line) && mv $line $name; done

후자의 예와 다양한 유사한 시도는 변수 값 대신 파일을 sed에 전달합니다.

$lineˋ ˋ와 둘 다를 사용하면 $($line)파일 실행이 시도됩니다. 하지만 변형이 있거나 없는 경우 "$line"모두 파일을 읽게 됩니다. 어떻게 되어가나요? 이를 달성하기 위해 이 변수를 sed와 직접 사용할 수 있습니까?'line'<$line

답변1

그것좋다.jpg현재 디렉터리의 모든 파일 이름 끝에 추가하기만 하면 됩니다 . 그렇다면 더 쉬운 방법이 있습니다.

for f in ./*; do
  mv -- "$f" "$f.jpg"
done

--대시( )로 -시작하는 파일 이름이 로 해석되지 않는지 확인하십시오 . 그러나 루프에서 경로를 사용하여 mv항상 시작 부분에 경로가 있는지 확인하므로 여기서는 문제가 되지 않습니다 .$f././*

의 출력은 ls사람의 눈으로 읽기 위한 것이며 일반적으로 여러분과 같은 while-read-loop로 전송되는 데 적합하지 않습니다.

예, 두 번째 예( sed -e 's/\(.*\)/\1.jpg/' $line)에서는 파일 내용을 읽습니다 sed. 그리고 Bash를 사용하면 바로 그렇게 할 수 있습니다 sed '...' <<<"$line". 이 구성은 표준 입력의 문자열을 명령에 전달하는 "here-string"이라는 <<<"string"Bash 확장(적어도 ksh및 에서도 사용 가능 )입니다.zsh

답변2

당신은 그것을 사용할 수 있습니다여기 문자열문법 <<<:

ls | while IFS= read -r line
do
  name=$(sed 's/\(.*\)/\1.jpg/' <<< $line) && mv "$line" "$name"
done

출력을 구문 분석하는 것 ls(따옴표가 없는 변수를 사용하지 않는 것)은 좋은 생각으로 간주되지 않습니다.

도구 이름 rename(단순히 파일 이름을 바꾸는 것이 목표인 경우):

rename -n 's/$/.jpg/' *

-n미리보기에서 실제 이름 바꾸기로 변경된 플래그가 제거되었습니다 .

관련 정보