Linux에서 명령줄을 사용하여 여러 하위 디렉터리의 여러 파일을 0으로 채우는 방법은 무엇입니까?

Linux에서 명령줄을 사용하여 여러 하위 디렉터리의 여러 파일을 0으로 채우는 방법은 무엇입니까?

각 폴더 안에 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

관련 정보