디렉토리에 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
, xargs
및 sed
:
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
을 호출하는 것 입니다.