![Linux에서 명령줄을 사용하여 여러 하위 디렉터리의 여러 파일을 0으로 채우는 방법은 무엇입니까?](https://linux55.com/image/208415/Linux%EC%97%90%EC%84%9C%20%EB%AA%85%EB%A0%B9%EC%A4%84%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%97%AC%EB%9F%AC%20%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%9D%98%20%EC%97%AC%EB%9F%AC%20%ED%8C%8C%EC%9D%BC%EC%9D%84%200%EC%9C%BC%EB%A1%9C%20%EC%B1%84%EC%9A%B0%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
각 폴더 안에 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