[file] Unix에서 패턴을 기반으로 여러 파일 이름 바꾸기

디렉토리에 prefix로 시작하는 여러 파일이 있습니다 ( fgh예 :

fghfilea
fghfileb
fghfilec

prefix로 시작하도록 모든 이름을 바꾸고 싶습니다 jkl. 각 파일의 이름을 개별적으로 바꾸는 대신 단일 명령을 수행해야합니까?



답변

몇 가지 방법이 있지만 사용 rename하는 것이 가장 쉬울 것입니다.

하나의 버전 사용 rename:

rename 's/^fgh/jkl/' fgh*

다른 버전을 사용하면 rename( Judy2K의 답변 과 동일 ) :

rename fgh jkl fgh*

플랫폼 설명서 페이지를 확인하여 위 중 어느 것이 적용되는지 확인해야합니다.


답변

이것은 어떻게 sed하고 mv이름 바꾸기를 할 함께 사용할 수 있습니다 :

for f in fgh*; do mv "$f" $(echo "$f" | sed 's/^fgh/jkl/g'); done

아래 주석에 따라 파일 이름에 공백이 있으면 따옴표는 파일을 이동하기 위해 이름을 반환하는 하위 함수 를 둘러싸 야 할 수 있습니다 .

for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done


답변

모든 시스템에 이름 바꾸기가있는 것은 아닙니다. 그래서 그것을 가지고 있지 않다면, bash shell 에서이 예제를 사용하십시오.

for f in fgh*; do mv "$f" "${f/fgh/xxx}";done


답변

mmv 사용 :

mmv "fgh*" "jkl#1"


답변

여러 가지 방법이 있습니다 (이들 모두가 모든 유닉스 시스템에서 작동하는 것은 아닙니다) :

  • ls | cut -c4- | xargs -I§ mv fgh§ jkl§

    §는 편리한 것으로 대체 될 수 있습니다. 당신도 이것을 할 수는 find -exec있지만 많은 시스템에서 미묘하게 다르게 행동합니다.

  • for f in fgh*; do mv "$f" "${f/fgh/jkl}";done

    그들이 말한대로 조잡하지만 효과적

  • rename 's/^fgh/jkl/' fgh*

    정말 아름답지만 BSD에는 가장 일반적인 유닉스 시스템 인 이름 바꾸기가 없습니다.

  • rename fgh jkl fgh*

  • ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';

    Perl을 사용한다고 주장하지만 시스템에 이름을 바꾸지 않은 경우이 몬스터를 사용할 수 있습니다.

그중 일부는 약간 복잡하고 목록이 완전하지는 않지만 거의 모든 유닉스 시스템에서 원하는 것을 찾을 수 있습니다.


답변

rename fgh jkl fgh*


답변

사용 find, xargssed:

find . -name "fgh*" -type f -print0 | xargs -0 -I {} sh -c 'mv "{}" "$(dirname "{}")/`echo $(basename "{}") | sed 's/^fgh/jkl/g'`"'

@nik의 솔루션 보다 복잡 하지만 파일 이름을 재귀 적으로 바꿀 수 있습니다. 예를 들어

.
├── fghdir
│   ├── fdhfilea
│   └── fghfilea
├── fghfile\ e
├── fghfilea
├── fghfileb
├── fghfilec
└── other
    ├── fghfile\ e
    ├── fghfilea
    ├── fghfileb
    └── fghfilec

이것으로 변형 될 것입니다.

.
├── fghdir
│   ├── fdhfilea
│   └── jklfilea
├── jklfile\ e
├── jklfilea
├── jklfileb
├── jklfilec
└── other
    ├── jklfile\ e
    ├── jklfilea
    ├── jklfileb
    └── jklfilec

그것을 작동시키는 열쇠 는 xargs에서 쉘xargs호출하는 것 입니다.