점진적으로 디렉터리 평면화 및 파일 이름 바꾸기(MacOS)

점진적으로 디렉터리 평면화 및 파일 이름 바꾸기(MacOS)

모든 파일의 이름을 바꿀 때 디렉터리(중복 하위 파일 이름 포함)를 평면화하거나, 중복을 유지하거나, 모든 파일 이름에 증분 숫자를 추가하려고 합니다(증가하는 # + 이름이 선호되지만 필수는 아님). 이를 위해서는 MacOS에서 실행해야 합니다. bash는 5.0.11로 업데이트되었습니다. 이는 다단계 프로세스(재귀 압축 풀기, 중복을 유지하면서 병합, pdftotxt, 문자열 > txt 파일에 대한 grep)의 일부이지만 몇 시간 동안 검색/테스트한 후에도 알 수 없는 부분입니다.

예:

Dir1
Folder A
  - file1.*
  - File2.*
Folder B
  - file1.*
  - File2.*
  - file3.*
Folder C
  - File1.*

Desired output:

Dir1
  - 1-file1.*
  - 2-File2.*
  - 3-file1.*
  - 4-File2.*
  - 5-file3.*
  - 6-File1.*

도움이 필요하세요?

답변1

2단계 프로세스:

단일 층

에서 시작하다

.
├── a
│   ├── file1.pdf
│   ├── file1.txt
│   ├── file2.pdf
│   └── file2.txt
└── b
    ├── file1.pdf
    └── file1.txt

1) 파일을 루트 이름으로 명명된 디렉터리로 이동합니다.

├── a
│   ├── file1
│   │   ├── file1.pdf
│   │   └── file1.txt
│   └── file2
│       ├── file2.pdf
│       └── file2.txt
└─ b
    └── file1
        ├── file1.pdf
        └── file1.txt

2) 인덱스를 늘리고 파일을 이동/이름을 바꾸면서 이러한 하위 디렉터리를 반복합니다.

├── 1-file1.pdf
├── 1-file1.txt
├── 2-file2.pdf
├── 2-file2.txt
├── 3-file1.pdf
└── 3-file1.txt

코드(용 bash)

# To be run with your Dir1 as the top directory.

tree . 

for f in */* # iterate files in directories
do
    dir="${f%.*}"  # same with dropped extension
    mkdir -p "$dir"
    mv "$f" "$dir"
done

tree .

i=0
for d in */*/ # iterate subdirectories create above
do
    (( ++i ))
    for f in "$d"/*
    do
        mv "$f" $i-${f##*/} # drop path components and prefix with index
    done
done
rmdir */*/ */
tree .

(물론 에 대한 호출을 제거할 수도 있습니다 tree.)

다단계

다음으로 시작하세요:

.
├── a
│   ├── file1.pdf
│   ├── file1.txt
│   ├── file2.pdf
│   └── file2.txt
└── b
    ├── c
    │   ├── file1.pdf
    │   └── file1.txt
    ├── file1.pdf
    └── file1.txt

중간 단계에서는 다음을 제공합니다.

.
├── a
│   ├── file1
│   │   ├── file1.pdf
│   │   └── file1.txt
│   └── file2
│       ├── file2.pdf
│       └── file2.txt
└── b
    ├── c
    │   └── file1
    │       ├── file1.pdf
    │       └── file1.txt
    └── file1
        ├── file1.pdf
        └── file1.txt

결국은 다음과 같습니다.

├── 1-file1.pdf
├── 1-file1.txt
├── 2-file2.pdf
├── 2-file2.txt
├── 3-file1.pdf
├── 3-file1.txt
├── 4-file1.pdf
└── 4-file1.txt

전체 코드:

shopt -s extglob
shopt -s globstar
shopt -s nullglob
tree . 

dirs=( */ ) 
for f in **/*.*
do
    dir="${f%.*}"
    mkdir -p "$dir"
    mv "$f" "$dir"
done

tree .

i=0 
for d in **/
do
    files=("$d"/*.*)
    [[ ${#files[@]} -eq 0 ]] && continue
    (( ++i ))
    for f in "${files[@]}"
    do
        mv -v "$f" $i-${f##*/}
    done
done
rm -r */
tree .

이 코드는 모든 파일의 이름(확장자)에 점이 있고 디렉터리에는 점이 없다고 가정합니다.

관련 정보