모든 파일의 이름을 바꿀 때 디렉터리(중복 하위 파일 이름 포함)를 평면화하거나, 중복을 유지하거나, 모든 파일 이름에 증분 숫자를 추가하려고 합니다(증가하는 # + 이름이 선호되지만 필수는 아님). 이를 위해서는 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 .
이 코드는 모든 파일의 이름(확장자)에 점이 있고 디렉터리에는 점이 없다고 가정합니다.