정규식 패턴을 사용하여 잘못된 파일, 디렉터리 및 하위 디렉터리 이름 바꾸기

정규식 패턴을 사용하여 잘못된 파일, 디렉터리 및 하위 디렉터리 이름 바꾸기

Linux에서 다음 패턴으로 생성된 여러 디렉터리, 하위 디렉터리 및 파일 이름이 있습니다.YYYY - mm - DD 시간 헤헤 : mm : 봄 여름 시즌(명확성을 위해 공백을 추가했지만 디렉터리/하위/파일 이름에는 공백이 없습니다. YYYY, MM, DD...는 정수이고 "-", "T", ":"는 표현식의 상수입니다).

이러한 디렉터리/파일은 Windows로 복사된 다음 다시 Linux로 복사되었으며 ":"이 손상되었습니다. ':'이 있어야 하는 모든 곳에는 '\357\200\242'가 있는데, 내가 하면 ???로 표시됩니다 ls.

mv및 의 조합을 사용하여 이 문제를 해결하는 것이 너무 복잡해서는 안 된다는 것을 알고 있지만 sed파이프, 정규식 및 sed사용법이 매우 녹슬었습니다.

지금까지 나는 이것을 가지고 있습니다

for a in *T*???*???*; do mv "$(echo "$a" | sed [***])"; done

[***]정규식이어야 하며 중간 에 두 자리 숫자가 포함되도록 *T*???*???*변경 되어야 합니다. 파일과 디렉터리의 이름을 재귀적으로 바꿔야 합니다. 나는 또한 이것이 여기서 사용하기에 적합한 입력 모드가 아니라고 생각합니다.*T*:*:**???

대체 방법

find나는 and 의 조합을 제공하는 많은 게시물을 보았지만 rename다시 말하지만, 나는 정규식에 약간 녹슬었고 이 상황에 대한 좋은 해결책을 찾을 수 없었습니다.

답변1

\357\200\2428진수라고 가정합니다 . 노력하다:

rename -n 's/\o{357}\o{200}\o{242}/:/g' 2018-*

이 명령은 renamePerl 정규식 대체와 함께 사용됩니다. 여기서는 8진수 바이트 값으로 주어진 세 문자를 콜론으로 바꿉니다.

왜냐하면 -n이것은 단지 그것이 무엇을 할 것인지를 인쇄하는 것이기 때문입니다. 따라서 무언가를 깨지 않고 테스트할 수 있습니다.

이것이 귀하의 요구 사항을 충족한다고 판단되면 를 제거하십시오 -n.

전체 디렉토리 트리를 탐색해야 하는 경우 find와 결합할 수 있습니다.

find . -depth -exec rename -n 's/\o{357}\o{200}\o{242}/:/g' {} \;

디렉토리 트리에 이름을 바꿀 필요가 없는 파일이 포함되어 있어도 걱정하지 마십시오. 정규식 대체가 파일 이름을 변경하지 않으면 파일 이름이 바뀌지 않습니다.

관련 정보