이름에 따옴표 '가 포함된 파일 이름 바꾸기

이름에 따옴표 '가 포함된 파일 이름 바꾸기

약간의 문제가 있습니다. 한 고객이 아주 오래된 서버에서 사이트를 마이그레이션해 달라고 요청했습니다. 그들이 어떻게 그곳에 도착했는지는 모르겠지만 '. 파일 이름을 바꿀 수 있는 방법이 있나요? mv이것은 완료되지 않은 것 같습니다.

ls다음과 같이 표시됨90843_O\\'ConnorPaul_GeneralManager.jpg

내가 시도할 때

 mv 90843_O\\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

>마치 추가 입력을 기다리는 것처럼 새 줄에서는 아무 작업도 수행하지 않습니다 .

내가 시도하면

mv 90843_O\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

오류가 발생했습니다.

mv: '90843_O\'ConnorPaul_GeneralManager.jpg'를 통계할 수 없습니다. 해당 파일이나 디렉터리가 없습니다.

\'또한 특정 폴더의 모든 파일을 쉽게 변경할 수 있는 방법이 있습니까 _?

답변1

mv 90843_OTab 키를 입력하고 누르면 Bash 탭 완성이 여기서 올바른 작업을 수행해야 합니다. 그렇지 않으면 이름을 적절하게 이스케이프하는 한 가지 방법은 다음과 같습니다.

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg

큰따옴표를 사용하면 이스케이프할 필요가 없지만 '두 개의 백슬래시 문자는 여전히 이스케이프되어야 합니다(각 백슬래시 문자는 네 개의 백슬래시를 형성합니다). 또 다른 옵션은 다음과 같습니다.

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg

여기서 백슬래시를 작은따옴표로 묶으면 백슬래시를 이스케이프할 필요가 없지만 리터럴을 추가하려면 작은따옴표를 끝내야 합니다 '. 이는 닫는 따옴표 뒤에서 이스케이프됩니다.

여기서 문제는 이름의 백슬래시와 작은따옴표에 있습니다. 루프를 사용하여 디렉토리에 있는 모든 파일의 순서를 \\'밑줄로 바꾸려면(질문의 파일 이름에 두 개의 백슬래시가 있으므로 둘 다 문제를 일으킬 수 있습니다):

for file in *"\\\\'"*; do
  mv -i "$file" "${file//"\\\\'"/_}"
done

파일을 덮어쓸 것인지 묻는 메시지가 표시됩니다 -i. mv사용 prename( rename많은 시스템에서 이에 대한 링크):

prename -n 's:\\\\'\'':_:g' *"\\\\'"*

-n원하는 대로 작동하고 있다는 사실이 만족스러우면 삭제하세요. 백슬래시 문자는 주위에 작은 따옴표가 있더라도 여기에서 perl 표현식 내에서 이스케이프되어야 합니다(작은 따옴표가 없으면 8개의 백슬래시가 필요합니다. 4개의 백슬래시는 쉘에 의해 제거되고 perl 표현식의 일부가 아니기 때문입니다). .

답변2

rename다음과 같은 작업 에 사용할 수 있습니다 .

➜  lab  ls                                               
1dsfa.file   6033dsfa.file                           90843_O\\'ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\'ConnorPaul_GeneralManager.jpg
➜  lab  rename "s/\'//g" *
➜  lab  ls
1dsfa.file   6033dsfa.file                           90843_O\ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\\ConnorPaul_GeneralManager.jpg

바꾸려면 이름 바꾸기를 '사용할 _수도 있습니다.

rename "s/\'/_/g" *

답변3

Grrr, @Graeme이 저를 이겼지만 어쨌든 게시하겠습니다…

예를 들어 파일 이름을 큰따옴표로 묶으면 mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg작동합니다. using은 -v선택 사항이지만 그 내용을 알려줍니다. 가능하다면 모든 문자를 이스케이프 처리하는 것 외에 두 번째 방법이 있다고 생각합니다. 이 방법에 대해 내가 아는 유일한 단점은 작은따옴표 안에 있지 않기 때문에 쉘이 텍스트를 처리하지만 내부 코드가 아니고 처리하는 데 필요한 추가 시간이 무의미하기 때문에 텍스트를 전혀 조작하지 않는다는 것입니다.

>방금 테스트한 결과, 큰따옴표로 묶인 텍스트에 char을 사용할 수 있으며 이는 파일 이름의 일부로 처리됩니다.

향후 팁으로, ./문제가 발생하면 파일 이름 앞에 이를 사용할 수 있습니다. 예를 들어 대시:로 시작하는 파일 이름은 로 mv ./-file file변경됩니다 . 이 경우 예외적으로 파일 이름을 인용하거나 이스케이프할 수 없습니다.-filefile

이상한 점은 90843_O'ConnorPaul_GeneralManager.jpg작은 따옴표를 이스케이프하면 파일을 만들 수 있지만 \'큰 따옴표가 아니거나 이스케이프하면 파일이 생성되지 않는다는 것입니다.

추신: Bash 완성은 또 다른 방법입니다. 파일의 파일 이름 문제를 해결하지만 "대시" 파일/폴더에는 작동하지 않습니다. 이름의 일부를 쓰고 Tab 키를 누르면 나머지 작업이 수행됩니다.

관련 정보