실수. Windows 예약 문자를 사용하여 파일 및 디렉터리 이름 바꾸기

실수. Windows 예약 문자를 사용하여 파일 및 디렉터리 이름 바꾸기

내 하드 드라이브가 Linux Mint에 마운트되지 않아 문제를 해결하려면 Windows로 가서 chkdsk /f e:.chkdsk를 실행해야 문제가 해결되었지만 모든 파일의 이름을 특수 문자로 바꾸고 파일을 디렉터리로 옮겼습니다 found.000. 이제 이전처럼 파일을 이동하고 이름을 바꿔야 합니다. 특수 문자가 포함된 파일 이름을 바꾸는 명령을 가끔 실행하면 이런 일이 다시 발생하는 것을 방지할 수 있습니다.

재귀적으로 하고 싶어요파일 및 디렉터리 이름 바꾸기현재 디렉토리에서. 이것개행 문자교체해야한다공간을 위해, 이것수치 < > : " \ | ? *~해야 한다삭제됨또는 예약되지 않은 유사한 문자로 바꾸는 것이 더 좋습니다.공간존재하다시작과 끝파일 이름은 다음과 같아야 합니다.삭제됨. 이것은 예이다내가 원하는 건:

rename(' Fîlenämè\n\r\n$@<>:"\|?* \n ', 'Fîlenämè $@')

이게 뭐야?아니면 더 나은:

rename(' Fîlenämè\n\r\n$@<>:"\|?* \n ', 'Filename $@')

~에 따르면이 답변다음과 같아야 합니다.

LC_ALL=C find . -depth -execdir rename -n 's/[\r\n]+/ /g; s/:/./g; s/[\|]/-/g; s/[<>"?*]//g; s/[ \f\t\v]+$//g; s/^[ \f\t\v]+//g' {} +

..Trash-1000명령이 나에게 제공하기 때문에 해당 디렉토리를 무시해야 합니다.입출력 오류명령이 작동을 멈췄습니다. 해당 디렉터리에 이름을 바꿀 수 있는 파일이 있는 경우 이러한 오류를 처리하는 스크립트가 있으면 완벽할 것입니다.

..Trash-1000다음과 같이 디렉토리를 정리하라는 지시를 받았습니다.이 답변. 나도 좀 살펴봤어이것. 하지만 이것은 작동하지 않습니다.

LC_ALL=C find . -depth -path ./..Trash-1000 -prune -o -print -execdir rename -n 's/[\r\n]+/ /g; s/:/./g; s/[\|]/-/g; s/[<>"?*]//g; s/[ \f\t\v]+$//g; s/^[ \f\t\v]+//g' {} +

그리고 파일 이름의 시작과 끝 부분에 있는 공백은 여전히 ​​제거되지 않았습니다.

내 질문을 질문으로 다시 작성해야 했습니다.이름 바꾸기를 사용하여 파일 이름(디렉토리 제외)의 유효하지 않은 문자를 반복적으로 바꾸는 스크립트나에게는 대답이 없습니다.

답변1

입력/출력 오류가 발생하는 디렉터리를 정리하는 대신 다른 모든 디렉터리에 대해 명령을 한 번 실행할 수 있습니다.

다음은 Windows 예약 문자를 제거하는 데 사용하는 명령입니다.

find . -execdir rename -n 's/[\r\n]+/ /g;
                           s/:/./g;
                           s/[\|]/-/g;
                           s/[<>"?*]//g;
                           s/[ \f\t\v]+$//g;
                           s/^[ \f\t\v]+//g' {} \;

개행 문자를 공백으로 변환한 다음 변경 사항으로 바꾼 다음 제거 하고 :파일 이름 끝의 공백을 제거한 다음 시작 부분의 공백에도 동일한 작업을 수행합니다..\|-<>"?*

관련 정보