파일 이름을 재귀적이고 순차적으로 바꾸는 방법은 무엇입니까?

파일 이름을 재귀적이고 순차적으로 바꾸는 방법은 무엇입니까?

나는 여기서 미쳐 가고있다. 이런 폴더가 많아요

Folder 1/
Subfolder 2/
Item.01 
Item.02
Subfolder 3/
Item.01
Item.02

폴더 1 내의 모든 파일 이름을 재귀적이고 순차적으로 바꾸고 싶지만 현재 계층 구조(표시된 대로)를 따르고 ls평면 구조(단일 폴더 내의 모든 파일)로 이동합니다.

예:

Folder 1/
Item 01
Item 02
Item 03 (previously Item 01 on Subfolder 2)
Item 04 (previously Item 02 on Subfolder 2)
Item 05 (previously Item 01 on Subfolder 3)

bash에서 이것이 가능합니까? 매우 감사합니다!

답변1

  1. globstar다음 옵션이 어떻게 도움이 되는지 알아보세요 bash.

    shopt -s globstar ; for i in ** ; do echo "$i" ; done
    

    이렇게 하면 디렉토리 트리에 있는 모든 항목의 정렬된 목록이 제공되지만 여기에는 파일 및 하위 디렉토리에 대한 항목(줄)이 포함됩니다.

  2. 하위 디렉터리를 필터링합니다.

    shopt -s globstar ; for i in ** ; do [ -f " $i" ] && echo "$i" ; done
    
  3. 카운터를 도입하고 현재 파일 접미사를 제거합니다.

    cnt=1
    shopt -s globstar
    for i in ** ; do
      [ -f "$i" ] && echo "${i%%.*}.$cnt"
      cnt=$((cnt=cnt+1))
    done
    
  4. 테스트 문을 원하는 내용 echo으로 바꿉니다.mv

    mv "$i" "${i%%.*}.$cnt"
    
  5. (선택 사항) globstar완료되면 이 옵션을 설정 해제합니다.

    `shopt +s globstar`
    

답변2

다음을 사용하는 것이 더 쉽습니다 zsh.

autoload zmv # best in ~/.zshrc
cd "Folder 1"
n=0; zmv -n '**/Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'

(만족스러우면 제거하세요 -n(드라이런의 경우)).

  • <->: 임의의 10진수 시퀀스( <x-y>무제한)
  • (#qn): 숫자 정렬에 사용됩니다( Subfolder 10그래서뒤쪽에 Subfolder 2).
  • ^/: 파일 형식 제외목차.
  • ${(l:2::0:)var}: 왼쪽 패딩(더 크면 잘림), s 길이 는 2 $var입니다 0.

경고 참고 사항: glob은 **/빈 수준을 포함하여 모든 수준의 하위 디렉터리와 일치하도록 설계되어 현재 디렉터리의 파일과 일치하지만, zmv한 번은 glob에, 두 번째는 단순 경로로 두 번 패턴에 전달하기 때문에 그렇지 않습니다. 캡처링 그룹을 추출하기 위한 패턴 일치(그런 다음 **/Item누락으로 인해 두 번째로 패턴 일치 /).

해결책은 다음을 사용하는 것입니다.

zmv -n '(**/)Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'

또는:

zmv -wn '**/Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'

그러나 그런 다음 zmv그것이 재귀 일치임을 감지하고 깊이 우선 순서를 켭니다(디렉터리 이름을 안전하게 바꿀 수 있도록). 현재 디렉터리의 파일을 깊이 우선 정렬 및 일치를 원하지 않는 경우 긴 형식의 **/( )를 사용할 수 있습니다.(*/)#

zmv -n '(*/)#Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'

존재하다:

.
├── Subfolder 1
│   ├── Item.01
│   ├── Item.02
│   └── Subsubfolder
│       └── Item.01
├── Subfolder 10
│   ├── Item.01
│   └── Item.02
└── Subfolder 2
    ├── Item.01
    └── Item.02

그것은 다음을 제공합니다:

mv -- Subfolder\ 1/Item.01 Item\ 01
mv -- Subfolder\ 1/Item.02 Item\ 02
mv -- Subfolder\ 1/Subsubfolder/Item.01 Item\ 03
mv -- Subfolder\ 2/Item.01 Item\ 04
mv -- Subfolder\ 2/Item.02 Item\ 05
mv -- Subfolder\ 10/Item.01 Item\ 06
mv -- Subfolder\ 10/Item.02 Item\ 07

관련 정보