일부 파일의 이름을 바꾸는 중입니다.
이것은 작동합니다:
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
미리보기에서 실제 이름 바꾸기로 변경된 플래그가 제거되었습니다 .