각 폴더 안에 1000개 이상의 jpeg가 포함된 약 200개의 폴더가 있는데, 모두 4자리까지 제로 패딩이 필요합니다. 이러한 폴더 중 일부에는 더 깊은 이미지가 포함된 하위 디렉터리도 있습니다. 사진의 이름은 모두 다릅니다(예: 한 폴더에서는 Image_1.jpg, Image_11.jpg 등으로 불리고 다른 폴더에는 Photo01.jpg, Photo02.jpg라는 파일이 포함될 수 있음)
.
├── folderA
│ ├── subfolder1
│ │ ├── Photo_1.jpg
│ │ └── Photo_11.jpg
│ └── subfolder2
│ ├── image001.jpg
│ ├── image002.jpg
│ └── image003.jpg
└── folderB
├── subfolder1
│ ├── foto_01.jpg
│ └── foto_01.jpg
└── subfolder2
├── foto_01.jpg
├── foto_02.jpg
└── foto_03.jpg
모든 하위 폴더로 이동하여 파일 이름의 숫자 0을 4자로 채우는 명령을 실행하는 방법을 알려줄 수 있는 사람이 있습니까?
답변1
사용 perl
rename
:
rename -n --filename 's/\d+/sprintf("%04d",$&)/e' *.jpg
또는 재귀적으로:
find . -type f -name "*.jpg" -exec rename -n --filename 's/\d+/sprintf("%04d",$&)/e' {} +
- 이 플래그는 경로가 아닌 파일 이름만 바뀌도록 보장합니다. 그렇지 않으면 등의
--filename
결과를 얻게 됩니다 .subfolder0001
-n
출력이 만족스러우면 삭제하세요.
답변2
사용하지 않는 솔루션의 경우펄 모듈rename
이 사용 사례의 경우:
files=$(find . -name '*.jpg' -type f)
newfiles=$(echo "$files" \
| sed -E 's|(.*/.*[^[:digit:]]+)([[:digit:]]+)(\.jpg)|\1\t\2\t\3|' \
| awk -F '\t' '{print $1 sprintf("%04d",$2) $3}')
while read f1; read -u 3 f2; do
echo mv "$f1" "$f2"
done <<< "$files" 3<<< "$newfiles"
설명하다
이 files
변수는 발견된 모든 jpg를 저장합니다. find
필요한 경우 "-regex"를 사용할 수 있습니다.
이 newfiles
변수는 새로운 jpg 파일 이름을 저장합니다. 코드는 경로 이름을 세 부분으로 분할합니다. 중간 부분은 jpg 파일 이름 끝에 있는 숫자이고 너비가 4가 되도록 0으로 채웁니다.
루프 while
는 두 개의 변수를 읽고 이 두 변수에 있는 파일 이름 목록을 사용하여 명령을 실행합니다. 이 경우 mv
명령을 화면에 에코합니다. echo
실제 이동을 수행하려면 삭제하세요 .
read -d
파일 이름 사이에 널 문자를 추가하고 , add 등을 사용하여 해당 문자를 읽어 read -r
개행, 탭 또는 백슬래시가 포함된 경로를 처리하도록 이 코드를 개선할 수 있습니다.
이름 바꾸기 이외의 작업에 대한 향후 사용 시나리오에서 이를 사용하고 수정할 수 있습니다.
산출
다음은 샘플 디렉터리 트리의 출력입니다.
mv ./folderB/subfolder2/foto_01.jpg ./folderB/subfolder2/foto_0001.jpg
mv ./folderB/subfolder2/foto_02.jpg ./folderB/subfolder2/foto_0002.jpg
mv ./folderB/subfolder2/foto_03.jpg ./folderB/subfolder2/foto_0003.jpg
mv ./folderB/subfolder1/foto_01.jpg ./folderB/subfolder1/foto_0001.jpg
mv ./folderB/subfolder1/foto_02.jpg ./folderB/subfolder1/foto_0002.jpg
mv ./folderA/subfolder2/image002.jpg ./folderA/subfolder2/image0002.jpg
mv ./folderA/subfolder2/image003.jpg ./folderA/subfolder2/image0003.jpg
mv ./folderA/subfolder2/image001.jpg ./folderA/subfolder2/image0001.jpg
mv ./folderA/subfolder1/Photo_1.jpg ./folderA/subfolder1/Photo_0001.jpg
mv ./folderA/subfolder1/Photo_11.jpg ./folderA/subfolder1/Photo_0011.jpg