
알았어, 난질문에 대답하기OP에는 Ubuntu에 관련 없는 소프트웨어를 설치하는 데 문제를 일으킬 수 있는 여러 저장소가 있습니다. 단일 라이너를 사용하여 PPA를 비활성화한 rename
다음 일련의 지침을 따르는 것이 좋습니다. 모든 것이 괜찮습니다. 그 질문에 대한 답변은 남겨두겠습니다.... 아니오. rename
예상대로 작동하지 않은 결과 :
sudo rename s/list/list\.disable/g /etc/apt/sources.list.d/*.list
/etc/apt/sources.list.d/
이를 통해 이름 바꾸기 로 끝나는 모든 파일을 살펴보고 로 .list
바꿀 것으로 기대합니다 . 거의 동일한 명령으로 또 다른 답변을 얻었지만 OP는 피드백을 제공하지 않았으며 먼저 테스트하지 않고 이론을 던지는 것입니다. 따라서 OP가 해당 라인에서 문제를 발견한 것은 놀랍게도 다음과 같습니다..list
.list.disable
Can't rename /etc/apt/sources.list.d/iaz-battery-status-quantal.list /etc/apt/sources.list.disable.d/iaz-battery-status-quantal.list.disable: No such file or directory
Can't rename /etc/apt/sources.list.d/ubuntu-wine-ppa-quantal.list /etc/apt/sources.list.disable.d/ubuntu-wine-ppa-quantal.list.disable: No such file or directory
Can't rename /etc/apt/sources.list.d/webupd8team-java-raring.list /etc/apt/sources.list.disable.d/webupd8team-java-raring.list.disable: No such file or directory
느낌이 이상해서 직접 이론을 테스트해봤는데 결과는 똑같네요. 그 다음에,문제가 발생할 때마다 일반적으로 정규식입니다.? 나는 여러 가지 뒤틀린 방식으로 정규식을 변경했습니다.
- s/.list/.list.disable/g
- s/.list/.list.disable/g
- /목록/list.disable/
- 기억나지 않는 다른 조합
/etc/apt/sources.list.d/*
글쎄, 나는 정규식이 문제가 아니라고 판단했기 때문에 선택기를 눈여겨보고 정규식 테스트를 위해 변경하고 재활용했습니다. 기쁨이 없습니다. 조금 좌절감을 느끼고 touch some.list
명령을 적용합니다.
rename s/\.list/\.list\.disable/g *
빙고! 이제 나는 온통 트롤링을 느꼈다. 나는 대답을 고치고 내 삶을 계속합니다... 아니오! 이는 허용되지 않습니다. 왜? 놀랍게도 현재 경로 예제만 사용하는 매뉴얼을 찾아봅니다. 이게 정상인가요? 아니면 기능이 구현되지 않아서일까요? 아니면 내 이론을 불신하기 시작해야 할까요?
답변1
패턴을 테스트할 때 매우 유용한 테스트 실행 모드로 -n
실행하려면 매개변수를 사용하세요 .rename
martin@martin ~ % rename -n s/list/list.disable/g /etc/apt/sources.list.d/*.list | sed 's/renamed as/\n =>/g'
[...]
/etc/apt/sources.list.d/spotify.list
=> /etc/apt/sources.list.disable.d/spotify.list.disable
/etc/apt/sources.list.d/steam.list
=> /etc/apt/sources.list.disable.d/steam.list.disable
[...]
여기서 명백한 오류는 패턴이 list
일치 하므로 폴더와 포함된 파일의 이름을 모두 바꾸려고 한다는 것입니다.sources.list.d
대신 이 패턴을 사용하세요.
rename -n 's/\.list$/.list.disable/' /etc/apt/sources.list.d/*.list | sed 's/renamed as/\n =>/g'
[...]
/etc/apt/sources.list.d/spotify.list
=> /etc/apt/sources.list.d/spotify.list.disable
/etc/apt/sources.list.d/steam.list
=> /etc/apt/sources.list.d/steam.list.disable
[...]
차이점은 다음과 같습니다.
.
검색 패턴에서 를 인용\.
하면 점이 문자가 아닌 실제 점에만 일치합니다(정규식에서 따옴표가 없는 점이 일반적으로 수행하는 작업입니다).이후
$
목록은 "문자열의 끝"을 의미합니다. 경로나 파일 이름의 다른 곳에 있는 ".list"가 아니라 파일 이름 끝에 있는 ".list"만 일치하고 교체되도록 보장합니다.대체 문자열에서 점을 따옴표로 묶을 필요는 없습니다. 따라서 ".list.disable"은 백슬래시 없이 작동합니다. 왜냐하면 백
.
슬래시에는 더 이상 특별한 의미가 없기 때문입니다.또한 쉘이 어떤 식으로든 정규식을 수정하는 것을 방지하기 위해 정규식을 작은따옴표로 묶었습니다.
답변2
g
문제는 실제로 패턴을 대신 고정해야 하는데 전역 스위치를 사용하는 것입니다 . 당신이 쓴대로 :
s/a/b/g
문자열의 모든 위치에서 모든 a를 b로 바꿉니다. 이로 인해 디렉터리가 없는 경로의 이름을 바꾸려고 합니다. 이는 디렉터리 내에서 작업을 수행할 때 문제가 사라져서 대체할 일치 항목이 하나만 있는 이유이기도 합니다.
패턴을 고정시키려는 의도가 있었던 것 같아요.
s/\.list$/.list.disable/
이는 존재하지 않는 /etc/apt/sources.list.disable.d/ 디렉토리로 파일을 이동하려는 시도를 방해했을 것입니다(따라서 파일을 그 디렉토리로 이동할 수 없습니다).