OSX의 특정 위치에 여러 파일, 하위 디렉터리의 이름을 바꾸고 문자를 삽입합니다.

OSX의 특정 위치에 여러 파일, 하위 디렉터리의 이름을 바꾸고 문자를 삽입합니다.

다음으로 시작하는 파일과 디렉토리가 있습니다."카테고리 아이콘-"많은 하위 디렉토리에 있습니다. 나는 재귀 적으로 이름을 바꾸려고합니다."카테고리-아이콘-". 누락된 내용을 추가하였으니 참고해주세요"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(from File::Find)는 두 번째 인수로 제공된 디렉터리 목록( .이 경우 현재 디렉터리, 필요에 따라 수정)을 반복합니다.
  • 첫 번째 인수는 트리에서 발견된 각 파일에 대해 실행되는 finddepth서브루틴 참조입니다 .finddepth
  • 조건으로 이 서브루틴을 시작합니다 if. 일치하는 파일 이름에 패턴이 포함되어 있으면 cateory-icon필요한 수정을 수행하고 함수 move(from )를 사용하여 File::Copy현재 이름을 새 이름으로 수정하여 새 이름을 형성합니다.

부인 성명

이 코드는 테스트되지 않았습니다. 먼저 가상 디렉터리 트리에서 사용해 보세요!

관련 정보