다음으로 시작하는 파일과 디렉토리가 있습니다."카테고리 아이콘-"많은 하위 디렉토리에 있습니다. 나는 재귀 적으로 이름을 바꾸려고합니다."카테고리-아이콘-". 누락된 내용을 추가하였으니 참고해주세요"G"도착하다범주그리고"에스"끝에상.
여러 파일과 디렉터리의 이름을 바꾸는 방법에 관한 수많은 질문을 살펴봤지만 그 중 어느 것도 도움이 되지 않았습니다!
답변에 대한 설명을 주시면 감사하겠습니다.
편집: 다음은 내 디렉토리 구조의 예입니다.
test/cateory-icon-archery/cateory-icon-archery.png
[email protected]
test/cateory-icon-automotive/cateory-icon-automotive.png
[email protected]
답변1
이 작업을 재귀적으로 수행해야 하므로 find
이 도구를 사용하는 것이 가장 좋습니다. 통화 sh
중에 사용할 수 있는 이름을 변경합니다 . -exec
예는 다음과 같습니다.
find /some/path -name 'cateory-icon' -exec sh -c 'mv "$1" "${1%/*}/category-icon-${1#cateory-icon-*}"' -- {} \;
${1#cateory-icon-*}
획득한 파일 이름을 확장합니다 cateory-icon
.
답변2
zsh에서 다음을 입력합니다 .zshrc
(또는 명령줄에서 한 번 실행).
autoload zmv
alias zcp='zmv -C'
alias zln='zmv -L'
이것zmv
기능zsh와 결합와일드카드 및 와일드카드 기능파일 이름을 쉽게 바꾸고 복사할 수 있습니다. 원하는 작업을 수행하는 몇 가지 방법은 다음과 같습니다.
zmv '(**/)cateory-icon-(*)' '${1}category-icons-$2'
zmv -w '**/cateory-icon-*' '${1}category-icons-$2'
zmv '**/cateory-icon-(*)' '$f:h/category-icons-$1'
일부 zsh 기능 설명:
**/
하위 디렉터리의 파일을 재귀적으로 일치시킵니다.- 소스 표현식의 괄호는 그룹을 지정합니다.
$NUM
또는${NUM}
대체 표현식에서 NUM 그룹에 포함된 원래 이름 부분으로 대체됩니다. - 주변 괄호는
**
조금 이상합니다.**/
더 이상도 그 이하도 아닌 주변에만 괄호를 넣을 수 있습니다. - 각 와일드카드를 자동으로 그룹에 추가하는 옵션
-w
입니다 ( 의 경우 그룹의 일부 이며 뒤에 옵니다 ).zmv
**
**/
/
$f
내가 대체한다는 것은 전체 소스 파일 이름을 의미합니다.$VAR:h
디렉토리 부분을 나타냅니다$VAR
. 이는 일반적$VAR
으로 마지막 항목까지 이지만/
모든 극단적인 경우(foo
,foo/
,/
, ...)는 올바르게 처리됩니다. 기본 이름은 으로 사용할 수 있습니다$VAR:t
.
답변3
최대 이식성을 위해 Perl을 사용하십시오.
#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;
use File::Copy qw(move);
my $new_name;
finddepth( sub {
if(/cateory-icon/){
($new_name = $File::Find::name) =~ s{.*/\Kcateory-icon}{category-icons};
move $File::Find::name => $new_name;
}
},
'.')
설명하다
- 이는 2개의 핵심 Perl 모듈을 활용합니다:
File::Find
디렉토리 트리의 재귀적 순회 및File::Copy
디렉토리의 재귀적 복사/이동을 위해. - 함수
finddepth
(fromFile::Find
)는 두 번째 인수로 제공된 디렉터리 목록(.
이 경우 현재 디렉터리, 필요에 따라 수정)을 반복합니다. - 첫 번째 인수는 트리에서 발견된 각 파일에 대해 실행되는
finddepth
서브루틴 참조입니다 .finddepth
- 조건으로 이 서브루틴을 시작합니다
if
. 일치하는 파일 이름에 패턴이 포함되어 있으면cateory-icon
필요한 수정을 수행하고 함수move
(from )를 사용하여File::Copy
현재 이름을 새 이름으로 수정하여 새 이름을 형성합니다.
부인 성명
이 코드는 테스트되지 않았습니다. 먼저 가상 디렉터리 트리에서 사용해 보세요!