내 디렉토리에는 이름에 문자가 포함된 파일이 많이 있으며 ?
이러한 문자를 제거하고 싶습니다 ?
.
도와주세요?
답변1
rename 's/\?//g' *
모든 파일의 이름을 바꿀 사람
francois@zaphod:~/tmp$ ls
toto_?_ toto_?_1 toto_?_2
francois@zaphod:~/tmp$ rename 's/\?//g' *
francois@zaphod:~/tmp$ ls
toto__ toto__1 toto__2
francois@zaphod:~/tmp$
답변2
또는 유사한 쉘이 bash
변수 값의 패턴과 일치하는 문자열의 모든 항목을 (예: 또는 )로 바꾸는 방법을 알고 있다고 가정합니다.${variable//pattern/replacement}
zsh
ksh
for name in ./*'?'*; do
mv -i "$name" "${name//'?'/}"
done
이는 현재 디렉터리에서 하나 이상의 이름을 포함하는 모든 이름을 반복하는 짧은 루프입니다 ?
(숨겨진 이름 건너뛰기). 이러한 각 이름에 대해 ?
파일 이름에서 문자가 제거되고 결과가 파일의 새 파일 이름으로 사용됩니다.
패턴의 작은따옴표는 ?
단일 문자와 일치하는 특수 와일드카드 문자로 처리되는 것을 방지합니다(따옴표가 없는 경우가 그렇습니다 ?
). \?
또는 을 사용할 수도 있습니다 [?]
.
출력에 물음표가 표시되면 ls
인쇄할 수 없는 문자를 나타내는 것일 수 있습니다.
제거하다이것들'?'
, 위 코드의 각 항목을 로 바꿉니다 [![:print:]]
. 와일드카드 패턴은 [![:print:]]
인쇄할 수 없는 문자와 일치합니다. 문자 [:print:]
클래스는 와 유사 [:graph:]
하지만 전자는 공백 문자와 일치하고 후자는 일치하지 않습니다. 사용자 [![:print:]]
회의아니요공백을 제거 하는 동안 공백을 제거합니다 [![:graph:]]
.