오류. 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' {} \;

줄 바꿈을 공백으로 바꾼 다음 를 대체하고 :.변경한 다음 \|제거 -하고 <>"?*파일 이름 끝의 공백을 삭제한 다음 시작 부분의 공백에 대해 동일한 작업을 수행합니다.

관련 정보