일괄적으로 파일 이름에서 보이지 않는 문자 제거

일괄적으로 파일 이름에서 보이지 않는 문자 제거

내 외장 드라이브에는 아마도 많이 복사되어 어느 시점에는 복원될 수도 있는 수백 개의 파일이 있습니다. 파일 이름이 수명 동안 이상한 문자를 얻은 것 같아서 이를 수정해야 합니다.

문제는 으로 나열할 수 있지만 ls이름을 참조하여 아무 것도 할 수 없다는 것입니다.

ls -l다음 결과를 렌더링합니다.

-rwx------  1 krzysztof  staff  322451 Jun 27  2009 file015.jpg
-rwx------  1 krzysztof  staff  331337 Jun 27  2009 file016.jpg
-rwx------  1 krzysztof  staff  303078 Jun 27  2009 file017.jpg
-rwx------  1 krzysztof  staff  312346 Jun 27  2009 file018.jpg

파일 자체는 손상되지 않았으며 이름을 수동으로 변경하면 문제가 사라집니다. 또한 정확히 동일한 이름으로 보이는 파일을 생성할 수도 있습니다(두 파일 모두 동시에 표시됩니다 ls). 이로 인해 보이지 않는 문자에 뭔가 수상한 일이 벌어지고 있다고 믿게 되었고, 이를 실행하여 확인했습니다. find . -name '*[! -~]*'문제의 모든 파일 목록이 반환되었습니다.

일반적으로 이러한 이름은 신경 쓰지 않지만 일부 앱과 도구에는 분명히 문제가 있어 표시되지 않거나 무시됩니다.

예를 들어 detox이름을 수정하기 위해 처음 사용했던 도구가 있습니다. 이름이 존재하지 않는 것처럼 가장했을 뿐입니다.

exiftool던지다 No such file or directory. 마찬가지로 ls -1루프로 파이핑하거나 파일 이름을 파일에 저장한 다음 파이핑하면 항상 다양한 형식이 생성됩니다 No such file or directory. 파이핑하거나 저장할 때 보이지 않는 문자를 유지하지 않는 것과 같은가요?

$ while read p; do
  mv "$p" "$p"
done <`find . -name '*.jpg'`
zsh: no such file or directory: ./file015.jpg

파일 이름을 일괄적으로 정리하는 방법이 있습니까?

편집 1:

ls -v@terdon의 요청 에 따라 시도했지만 ls -B결과가 없습니다.

그러나 그것은 ls | head -n1 | od -c더 흥미로웠고 나 자신의 발견을 할 수 있게 해주었습니다. 내 원래 질문에서 이름이 중요하지 않다고 생각했지만 그랬기 때문에 이름을 변경했기 때문에 사과드립니다.

이를 통해 다음은 파일 014가 수동으로 복구되고 나머지는 손상된 실제 출력입니다.

❯ ls -1
Zdjęcie014.jpg
Zdjęcie015.jpg
Zdjęcie016.jpg
Zdjęcie017.jpg
Zdjęcie018.jpg

이것은 - 저는 단지 첫 번째 파일 이름 이상의 것을 표시 ls | head -n2 | od -c하곤 했습니다 .n2

❯ ls | head -n2 | od -c
0000000    Z   d   j   e    ̨  **   c   i   e   0   1   4   .   j   p   g
0000020   \n   Z   d   j   e    ̨  **   c   i   e   0   1   5   .   j   p
0000040    g  \n
0000042

여기에 이미지 설명을 입력하세요.

보시다시피 ę두 파일과 ls | head -n2 | od -c. 다시 수동으로 편집하고 파일 이름을 바꾸면 014(고정 파일)에서 커서를 뒤에 놓고 ę백스페이스를 누르면 문자 전체가 사라집니다. 다른 파일의 경우에는 해당되지 않습니다. 백스페이스 키를 누르면 해당 파일이 ę변경되고 e, 두 번째 백스페이스 키만 누르면 삭제됩니다.

@terdon에게 감사드립니다. 이제 문제가 무엇인지 알았습니다. 이 문제를 대량으로 해결하려면 어떻게 해야 합니까?

편집 2:

014 고정됨, 015 손상됨:

❯ ls | head -n2 | LC_ALL=C sed -n l
Zdje\314\250cie014.jpg$
Zdje\314\250cie015.jpg$

편집 3:

의견에서 제안한대로 솔루션을 적용해 보았습니다.macOS에서 악센트로 파일 이름을 바꾸는 방법은 무엇입니까?그런데 다시 만났어No such file or directory

❯ rename $'s/\u119/e/g' ./*
Can't rename './Zdjęcie015.jpg' to './Zdjecie015.jpg': No such file or directory

rename $'s/\u0328//g' ./*Bash와 zsh에서는 아무것도 하지 않습니다.

편집 4:

❯ PERL_UNICODE=ASD find . -depth -execdir rename -n 's/\pM//g' {} +
'Zdjęcie015.jpg' would be renamed to 'Zdjecie015.jpg'

그리고

❯ PERL_UNICODE=ASD find . -depth -execdir rename 's/\pM//g' {} +
Can't rename 'Zdjęcie015.jpg' to 'Zdjecie015.jpg': No such file or directory

답변1

macOS에서 작동하도록 할 수 없었기 때문에 이것이 실제로 대답인지는 확실하지 않지만 내 문제에 대한 해결 방법인 것 같았습니다.

외장 드라이브가 NAS이기 때문에 SSH로 연결해서 문제를 직접 해결했습니다. 불행하게도 저는 이와 같은 멋진 도구에 접근할 수 없어서 , 및를 rename사용해야 했고 find- 잘 작동했습니다!mvsed

이것은 내가 사용하는 명령입니다:

find ./ -maxdepth 1 -name "*.JPG" -exec sh -c 'mv "$1" "$(echo "$1" | sed s/Zdj.*cie/zdjecie/)"' _ {} \;

추신: 댓글란에 도움을 주신 영웅들에게 감사드립니다!

관련 정보