다음으로 시작하는 파일과 디렉토리가 있습니다."카테고리-아이콘-"많은 하위 디렉토리에 있습니다. 재귀 적으로 이름을 바꾸려고합니다."카테고리-아이콘-". 누락된 부분을 추가하였으니 참고해주세요"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;
}
},
'.')
설명
File::Find
이는 디렉토리 트리의 재귀적 순회 및File::Copy
디렉토리의 재귀적 복사/이동을 위해 2개의 Perl 핵심 모듈을 사용합니다.- 함수
finddepth
(fromFile::Find
)는 두 번째 인수로 제공된 디렉터리 목록을 순회합니다(.
이 경우에는 현재 디렉터리입니다. 필요에 따라 수정합니다). - 첫 번째 인수는 트리를 탐색하면서 만나는
finddepth
모든 파일에 대해 실행되는 서브루틴 참조입니다 .finddepth
- 조건 에 따라 이 서브루틴을 시작합니다
if
. 일치하는 파일 이름에 패턴이 있는 경우cateory-icon
필요한 수정을 수행하여 새 이름을 형성하고move
함수(fromFile::Copy
)를 사용하여 현재 이름을 새 이름으로 수정합니다. 이름.
부인 성명
이 코드는 테스트되지 않았습니다. 먼저 더미 디렉터리 트리에서 시도해 보세요!