이름에 따옴표가있는 파일 이름 바꾸기


11

약간의 문제가 있습니다. 한 고객이 정말 오래된 서버에서 사이트를 마이그레이션하는 작업을 맡았습니다. 그들이 어떻게 도착했는지 모르지만 '이름에 파일이 있습니다 . 파일 이름을 바꾸는 방법이 있습니까? 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
당신이있는 경우 moreutils을 , 그것은 vidir이러한 종류의 문제에 대한 간단한 솔루션입니다.
derobert

답변:


6

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

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

-imv모든 파일을 덮어 쓸 것인지 프롬프트. 사용 prename( rename많은 시스템에서 이것에 연결) :

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

-n당신이 원하는 것을하고있을 때 행복을 제거하십시오 . 백 슬래시 문자는 여기에 perl 표현식 내에서 이스케이프되어야합니다 (단일 따옴표가 없으면 셸에 의해 4 개가 제거되고 perl 표현식의 일부가 아니므로 작은 따옴표없이 8 개의 백 슬래시가 필요함).


4

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" *

-2

Grrr, @Graeme이 나를 이겼지 만 어쨌든 게시 할 것입니다 ...

파일 이름과 같이 큰 따옴표로 인용 mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg하면 트릭을 수행합니다. 사용 -v은 선택 사항이지만 수행 한 내용을 알려줍니다. 나는 가능하다면 모든 문자를 피하는 것 외에 두 번째 방법이 있다고 생각합니다. 내가 아는 유일한 단점은 쉘이 작은 따옴표 안에 없기 때문에 텍스트를 처리하지만 내부 코드가 아니기 때문에 텍스트를 처리하지 않으며 처리하는 데 추가 시간이 의미가 없다는 것입니다.

방금 테스트를 마쳤 >으면 큰 따옴표로 묶은 텍스트 내에서 char을 사용할 수 있으며 파일 이름의 일부로 사용됩니다.

미래를위한 팁, 당신은 사용할 수 ./는 대시로 시작하는 파일과 같은 문제를 제공하는 경우 파일 이름 직전 : mv ./-file file이름을 바꿉니다 -filefile. 이 경우 예외로 파일 이름을 인용하거나 이스케이프 할 수 없습니다.

이상하게도로 90843_O'ConnorPaul_GeneralManager.jpg작은 따옴표를 이스케이프 하면 파일을 만들 수 \'있지만 큰 따옴표 나 이스케이프되지 않은 경우 파일을 만들지 않습니다.

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


왜 downvote입니까? 나는 다른 사람들보다 먼저 글을 쓰고 있었지만 먼저 게시 할만 큼 빠르지 않았습니다.
rautamiekka

내가 아니 었어 아래로 투표 한 단서가 없습니다.
Igor Yavych

1
이 대답은 옳지 않습니다. 파일 이름에서 백 슬래시를 무시하고 실제로 작은 따옴표보다 다루기가 더 어렵습니다.
Graeme
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.