ubuntu / bash에서 파일 및 디렉토리 이름을 재귀 적으로 변경합니다.
"특수"라는 단어가 포함 된 모든 파일과 디렉토리의 이름을 "일반"으로 바꾸고 싶습니다. "Special"이 "일반"이되지 않도록 대소 문자 구분을 유지해야합니다.
Bash에서 재귀 적으로 어떻게 할 수 있습니까?
이것을 시도하십시오 ( bash --version
> = 4 필요 ) :
shopt -s globstar
rename -n 's/special/regular/' **
-n
테스트가 정상 이면 스위치를 제거하십시오.
이 작업을 수행 할 수 있거나 수행하지 못할 수있는 동일한 이름의 다른 도구가 있으므로주의하십시오.
다음 명령 ( GNU
) 을 실행하면
$ file "$(readlink -f "$(type -p rename)")"
그리고 당신은 같은 결과가 있습니다
.../rename: Perl script, ASCII text executable
포함하지 않음 :
ELF
그러면 이것이 올바른 도구 인 것 같습니다 =)
그렇지 않은 경우 기본값 (일반적으로 이미있는 경우)으로 설정 Debian
하고 다음과 같이 파생합니다 Ubuntu
.
$ sudo update-alternatives --set rename /path/to/rename
( 명령 /path/to/rename
경로로 perl's rename
바꿉니다.
이 명령이없는 경우 패키지 관리자를 검색하여 설치하거나 수동으로 수행하십시오.
마지막으로,이 도구는 원래 Perl의 아버지 인 Larry Wall이 작성했습니다.
다음을 사용하는 솔루션 find
:
파일 이름 만 변경하려면 :
find /your/target/path/ -type f -exec rename 's/special/regular/' '{}' \;
디렉토리 이름 만 변경하려면 다음을 수행하십시오.
find /your/target/path/ -type d -execdir rename 's/special/regular/' '{}' \+
파일과 디렉토리의 이름을 바꾸려면 다음을 수행 하십시오 .
find /your/target/path/ -execdir rename 's/special/regular/' '{}' \+
다른 도구를 설치해도 괜찮다면 rnm 을 사용할 수 있습니다 .
rnm -rs '/special/regular/g' -dp -1 *
그것은 (때문에 모든 디렉토리 / 하위 디렉토리를 통해 이동합니다 -dp -1
)와 교체 특수 와 일반을 자신의 이름으로.
@speakr의 대답 은 저에게 단서였습니다.
-execdir을 사용하여 파일과 디렉토리를 모두 변환 -type f
하는 경우 표시된 예제 에서도 제거 할 수 있습니다 . 철자를 쓰려면 다음을 사용하십시오.
find /your/target/path/ -execdir rename 's/special/regular/' '{}' \+
또한, 추가하는 것을 고려 g
교체 할 경우 정규식에 (global) 플래그를 모두 의 발생을 special
함께 regular
단지 첫 번째 항목을 지정된 파일 이름이 아니라. 예를 들면 :
find /your/target/path/ -execdir rename 's/special/regular/g' '{}' \+
로 변환 special-special.jpg
됩니다 regular-regular.jpg
. 전역 플래그가 없으면 regular-special.jpg
.
참고 : GNU Rename은 Mac OSX에 기본적으로 설치되지 않습니다. 당신이 사용하는 경우 브루 패키지 관리자를 , brew install rename
이 문제를 해결합니다.
디렉토리 이름을 변경하려는 사람들을 위해 다음 명령을 사용할 수 있습니다.
find /your/target/path/ -type d -execdir rename 's/special/regular/' '{}' \;
노트 유형은 이제 d
디렉토리 용이며 -execdir
.
그러나 한 번의 패스로 파일과 디렉토리의 이름을 바꾸는 방법을 알아낼 수 없었습니다.
누군가 루트 폴더의 이름을 변경하면 더 이상 파일 트리를 탐색 할 수 없다고 이전에 언급했습니다. -d
상향식에서 깊이 순회를 수행 하는 스위치가 있으므로 루트 이름은 마지막으로 이름이 변경됩니다.
find -d /your/target/path/ -type d -execdir rename 's/special/regular/' '{}' \;
맨 페이지 ( man find
)에서 :
-d Cause find to perform a depth-first traversal, i.e., directories are visited in post-order and all entries in a directory will be
acted on before the directory itself. By default, find visits directories in pre-order, i.e., before their contents. Note, the
default is not a breadth-first traversal.
다음은 더 이식 가능하고 명령에 의존 하지 않는 또 다른 접근 방식입니다 rename
(배포판에 따라 다른 매개 변수가 필요할 수 있기 때문에).
파일과 디렉토리의 이름을 재귀 적으로 바꿉니다.
find . -depth -name "*special*" | \
while IFS= read -r ent; do mv $ent ${ent%special*}regular${ent##*special}; done
그것이하는 일
- find with
-depth
parameter를 사용 하여 깊이 우선 순회 를 수행하여 결과를 재정렬하십시오 (즉, 디렉토리의 모든 항목이 디렉토리 자체 앞에 표시됨). - 경로에서 규칙 의 마지막 발생 만 수정하기 위해 패턴 대체를 수행 하십시오.
이렇게하면 파일이 먼저 수정 된 다음 각 상위 디렉토리가 수정됩니다.
예
다음 트리 제공 :
├── aa-special-aa
│ └── bb-special
│ ├── special-cc
│ ├── special-dd
│ └── Special-ee
└── special-00
mv
특정 순서로 해당 명령을 생성 합니다.
mv ./aa-special-aa/bb-special/special-cc ./aa-special-aa/bb-special/regular-cc
mv ./aa-special-aa/bb-special/special-dd ./aa-special-aa/bb-special/regular-dd
mv ./aa-special-aa/bb-special ./aa-special-aa/bb-regular
mv ./aa-special-aa ./aa-regular-aa
mv ./special-00 ./regular-00
다음 트리를 얻으려면 :
├── aa-regular-aa
│ └── bb-regular
│ ├── regular-cc
│ ├── regular-dd
│ └── Special-ee
└── regular-00
'IT박스' 카테고리의 다른 글
ActiveRecord Arel OR 조건 (0) | 2020.12.28 |
---|---|
MongoDB 컬렉션의 하위 집합을 다른 컬렉션에 저장 (0) | 2020.12.28 |
저장 프로 시저 및 EDMX 업데이트 (0) | 2020.12.28 |
Java의 문자열에서 두 번째 하위 문자열 찾기 (0) | 2020.12.28 |
IdentityUserLogin (0) | 2020.12.28 |