your programing

ubuntu / bash에서 파일 및 디렉토리 이름을 재귀 적으로 변경합니다.

lovepro 2020. 12. 26. 16:15
반응형

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) 모든 디렉토리 / 하위 디렉토리를 살펴 보고 이름에서 specialregular 으로 바꿉니다.


@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 -depthparameter를 사용 하여 깊이 우선 순회 를 수행하여 결과를 재정렬합니다 (즉, 디렉토리의 모든 항목이 디렉토리 자체 앞에 표시됨).
  • 경로에서 규칙 의 마지막 발생 만 수정하기 위해 패턴 대체를 수행 하십시오.

이렇게하면 파일이 먼저 수정 된 다음 각 상위 디렉토리가 수정됩니다.

다음 트리 제공 :

├── 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

참조 URL : https://stackoverflow.com/questions/15012631/rename-files-and-directories-recursively-under-ubuntu-bash

반응형