여러 파일 이름 바꾸기, 일부 하위 문자열 변경 [중복]

여러 파일 이름 바꾸기, 일부 하위 문자열 변경 [중복]

image(1) image(2) image(3)와 비슷한 이름을 가진 파일이 많이 있습니다. image1.jpg image2.jpg 등의 이름을 바꾸고 싶습니다. 중괄호를 통해 두 단계로 수행할 수 있습니다. 이는 분명히 해당 줄에 대해 내장된 쉘 제공 문자열 대체 함수인 것 같습니다.

orig="a_string"
mod=${orig/string/new_thing}

a_string을 a_new_thing으로 변환합니다. 따라서 for 루프에서 이를 사용하면 )를 .jpg로 변환할 수 있습니다.

for f in *; do mv $f "${f/)/.jpg}" ;done

그런 다음

for f in *; do mv $f "${f/\(/}" ;done

(를 제거하세요. 여는 괄호는 이스케이프되어야 합니다. 그렇지 않으면 쉘은 그것이 다른 것의 시작이라고 생각할 것입니다. 닫는 괄호는 이렇게 이스케이프할 필요가 없습니다. 그래서 제 질문은, 한 줄이 있습니까 아니면 이를 수행하는 다른 더 좋은 방법은 파이프를 사용하는 것과 같습니다. 파일 이름의 대괄호로 인해 문제가 발생하면 잠시 동안 해당 대괄호가 제거되어 두 개의 하위 문자열을 다른 두 개의 문자열로 바꾸는 간단한 문제가 남습니다.

답변1

명령을 사용하여 여러 파일의 이름을 바꿀 수 있습니다 rename. 이 경우 가능한 해결책은 다음과 같습니다.

rename 's/\(//; s/\)/.jpeg/;' image*

답변2

이중 슬래시를 사용하면 여러 항목을 한 번에 변경할 수 있습니다.

for f in * ; do mv "$f" "${f//[()]/}.jpg" ; done

답변3

여러 대체를 수행하는 방법에 대한 일반적인 질문을 다루겠습니다(특히 이름 바꾸기에서, 이는 다른 상황에 적용될 수 있음). 이름에 "over"와 "dog"라는 단어가 포함된 파일이 여러 개 있고 이를 각각 "under"와 "cat"로 바꾸고 싶다고 가정합니다.

무차별 대입:

for f in *
do
    g=${f/over/under}
    h=${g/dog/cat}
    mv -- "$f" "$h"
done

(이렇게 하면 --파일 이름이 다음으로 시작하여 발생할 수 있는 바람직하지 않은 동작으로부터 사용자를 보호할 수 있습니다.-. mv -- "$f" "$h".jpg필요한 경우 마지막 줄을 로 변경합니다. ) 파일 이름에오직"초과하다"또는 "dog"(둘 다는 아님)의 경우 하나만 대체할 수 있습니다. "dog"과 "over"(순서대로)가 포함되어 있으면 여전히 교체를 수행합니다. 포즈를 취하는 경우 문자열은 "(" 및 ")"이며 아마도 해당 동작이 마음에 들지 않을 것입니다.

폴리스티렌mv실제로 다음과 같이 명령을 보호 해야 합니다 .

if [ "$f" != "$h" ]
그 다음에
    if [-e "$h"]
    그 다음에
        (오류 처리)
    기타
        mv——"$f" "$h"
    필리핀 제도
완벽한

파일 이름을 자체 이름으로 바꾸려고 할 때 오류 메시지가 표시되는 것을 방지하려면(이름에는 다음이 포함되어 있지 않기 때문입니다)누구나문자열) 및 기존 파일 손상을 방지합니다(예: 파일이 있고 image(1)이미 파일이 있는 경우 image1.jpg).

그리고sed

for f in *
do
    g=$(sed 's/\(.*\)over\(.*\)dog\(.*\)/\1under\2cat\3/' <<< "$f")
    mv -- "$f" "$g"
done

이는 첫 번째 것과 반대입니다. "초과"하는 경우에만 교체합니다.그리고"개"둘 다(순서대로) 나타나고 그렇지 않으면 나타나지 않습니다.

("here string") 구문은 <<<모든 쉘에서 작동하지 않습니다. 이 문자열을 지원하지 않는 쉘에서 위의 작업을 수행하려면 다음을 수행하십시오.

for f in *
do
    g=$(printf "%s" "$f" | sed 's/\(.*\)over\(.*\)dog\(.*\)/\1under\2cat\3/')
    mv -- "$f" "$g"
done

관련 정보