디렉토리의 파일 이름에서 GET 매개변수 제거

디렉토리의 파일 이름에서 GET 매개변수 제거

?와 같은 여러 이름 중에서 선택해야 합니다 image.jpg?foo=bar&bar=foo. 누군가가 어떻게 수행되는지 말해 줄 수 있습니까?

어떤 이유로 다음 명령이 작동하지 않습니다.

rename "\?." "" *
rename 's/(.*)\.jpg\?.*/$1\.jpg/' *

답변1

이것은 매우 간단합니다.

이름에 " "가 포함된 각 파일에 대해 for 루프를 수행하고 있습니다 ?.

이 for 루프는 mv이러한 모든 파일에 대해 (== 이름 바꾸기) 명령을 호출합니다.추가하다이 파일 이름에는 " " 다음 부분이 없습니다 ?.

정확한 명령은 다음과 같습니다.

for i in *\?*;do mv -vf "${i}" "${i%%\?*}";done

이것은 약간 비밀스러워 보일 수도 있지만 이는 다음과 같은 의미입니다 . "'i'라는 변수는 "${i%%\?*}"꼬리에서 '' ?뒤의 모든 항목을 제거합니다.

조금 신비한 것이 또 있는데, 그것은 부분입니다 *\?*. ?이름에 " "가 포함된 현재 디렉터리의 모든 파일을 나타냅니다 . 이것은 (win)do(w)s와 같은 패턴입니다. 유일한 차이점은 ' ?'는 기본적으로 모든 문자를 의미한다는 것입니다. 백슬래시(' \')는 이 특별한 의미를 제거하는 데 사용됩니다.

관련 정보