약간의 문제가 있습니다. 한 고객이 정말 오래된 서버에서 사이트를 마이그레이션하는 작업을 맡았습니다. 그들이 어떻게 도착했는지 모르지만 '
이름에 파일이 있습니다 . 파일 이름을 바꾸는 방법이 있습니까? 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를 통계 할 수 없습니다 : 해당 파일 또는 디렉토리가 없습니다.
또한 특정 폴더의 모든 파일에서 변경 \'
하는 간단한 방법이 _
있습니까?
답변
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
는 -i
것 mv
모든 파일을 덮어 쓸 것인지 프롬프트. 사용 prename
( rename
많은 시스템에서 이것에 연결) :
prename -n 's:\\\\'\'':_:g' *"\\\\'"*
-n
당신이 원하는 것을하고있을 때 행복을 제거하십시오 . 백 슬래시 문자는 여기에 perl 표현식 내에서 이스케이프되어야합니다 (단일 따옴표가 없으면 셸에 의해 4 개가 제거되고 perl 표현식의 일부가 아니므로 작은 따옴표없이 8 개의 백 슬래시가 필요함).
답변
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" *
답변
Grrr, @Graeme이 나를 이겼지 만 어쨌든 게시 할 것입니다 …
파일 이름과 같이 큰 따옴표로 인용 mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg
하면 트릭을 수행합니다. 사용 -v
은 선택 사항이지만 수행 한 내용을 알려줍니다. 나는 가능하다면 모든 문자를 피하는 것 외에 두 번째 방법이 있다고 생각합니다. 내가 아는 유일한 단점은 쉘이 작은 따옴표 안에 없기 때문에 텍스트를 처리하지만 내부 코드가 아니기 때문에 텍스트를 처리하지 않으며 처리하는 데 추가 시간이 의미가 없다는 것입니다.
방금 테스트를 마쳤 >
으면 큰 따옴표로 묶은 텍스트 내에서 char을 사용할 수 있으며 파일 이름의 일부로 사용됩니다.
미래를위한 팁, 당신은 사용할 수 ./
는 대시로 시작하는 파일과 같은 문제를 제공하는 경우 파일 이름 직전 : mv ./-file file
이름을 바꿉니다 -file
에 file
. 이 경우 예외로 파일 이름을 인용하거나 이스케이프 할 수 없습니다.
이상하게도로 90843_O'ConnorPaul_GeneralManager.jpg
작은 따옴표를 이스케이프 하면 파일을 만들 수 \'
있지만 큰 따옴표 나 이스케이프되지 않은 경우 파일을 만들지 않습니다.
추신 : 배쉬 완성은 다른 방법으로 파일의 파일 이름 문제를 해결했지만 “대시”파일 / 폴더에서는 작동하지 않습니다. 이름의 일부를 작성하고 Tab 키를 누르면 나머지가 수행됩니다.