모든 하위 디렉터리의 모든 파일/폴더에서 모든 공백을 하이픈으로 바꾸려면 다음 명령을 실행합니다.
find /path/to/folder -depth -name "* *" -execdir rename 's/ /-/g' "{}" \;
효과가있다.
모든 하위 디렉터리의 모든 파일/폴더에서 모든 마침표(확장자 제외)를 하이픈으로 바꾸려면 다음 명령을 실행합니다.
find /path/to/folder -depth -name "*.*" -execdir rename 's/./-/g' "{}" \;
그러나 이것은 작동하지 않습니다. 대신, 파일 이름을 ----------의 긴 목록으로 바꿉니다.
내가 뭘 잘못했나요?
답변1
마침표는 정규 표현식에서 특별하며 모든 문자와 일치합니다. 문자 그대로 마침표를 일치시키려면 백슬래시를 사용하십시오.
rename 's/\./-/g'
GNU를 포함한 -execdir
일부 find
구현 의 경우 find
각 이름은 마침표로 시작됩니다. 마침표를 건너뛰려면 다음을 사용하세요.
's/(?<=.)\./-/g'
(?<=.)
는과거 지향적 주장기간 이전에 뭔가가 있는지 확인하지만 교체하지는 않습니다.
일부 Perl rename
변형은 코드가 파일의 기본 이름에만 작동하도록 하는 옵션도 지원하므로 -d
비표준 -execdir
1도 필요하지 않습니다.
find /path/to/folder -depth -name '* *' -exec rename -d 's/\./-/g' {} +
마지막 지점을 유지하려면 다음을 사용할 수 있습니다.미리보기 주장어딘가에 점이 뒤따르는 점만 대체합니다.
's/(?<=.)\.(?=.*\.)/-/g'
1 이는 하나만 호출하는 +
대신 를 사용하여 여러 파일을 처리 할 수도 있음을 의미합니다 . 일부 구현에서는 이를 지원 하지만 이름에 파일이 포함된 각 디렉터리에 대해 적어도 한 번은 실행 해야 합니다.;
rename
find
+
-execdir
rename
-