여러 파일, 하위 디렉터리의 이름을 바꾸고 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;
                 }
           },
          '.')

설명

  • File::Find이는 디렉토리 트리의 재귀적 순회 및 File::Copy디렉토리의 재귀적 복사/이동을 위해 2개의 Perl 핵심 모듈을 사용합니다.
  • 함수 finddepth(from File::Find)는 두 번째 인수로 제공된 디렉터리 목록을 순회합니다( .이 경우에는 현재 디렉터리입니다. 필요에 따라 수정합니다).
  • 첫 번째 인수는 트리를 탐색하면서 만나는 finddepth모든 파일에 대해 실행되는 서브루틴 참조입니다 .finddepth
  • 조건 에 따라 이 서브루틴을 시작합니다 if. 일치하는 파일 이름에 패턴이 있는 경우 cateory-icon필요한 수정을 수행하여 새 이름을 형성하고 move함수(from File::Copy)를 사용하여 현재 이름을 새 이름으로 수정합니다. 이름.

부인 성명

이 코드는 테스트되지 않았습니다. 먼저 더미 디렉터리 트리에서 시도해 보세요!

관련 정보