이름이 모두 5003.jpg인 수백 개의 .jpg 파일을 이동하고 이름을 바꿉니다.

이름이 모두 5003.jpg인 수백 개의 .jpg 파일을 이동하고 이름을 바꿉니다.

거래는 이것이다. 내 여자친구는 내가 그녀의 iPhone에 있는 모든 사진을 그녀의 노트북으로 전송하기를 원한다(우리는 Ubuntu 14.04를 실행하고 있다). 제가 사용해 보았던 전용 프로그램 중 어느 것도 작동하지 않았기 때문에 저는 그녀의 iPhone에 있는 모든 사진이 포함된 DCIM/ 폴더 전체를 복사했습니다. 내 딜레마는 DCIM/이 4개의 폴더로 나누어져 있으며 각 사진마다 별도의 폴더가 있다는 것입니다. 각 폴더에 있는 각 사진의 이름은 "5003.jpg"입니다.

명령줄을 사용하여 이러한 모든 파일(아마도 0001.jpg, 0002.jpg 등의 오름차순 숫자 이름 포함)을 ~/Pictures/iPhone/과 같은 폴더로 이동하고 이름을 바꾸고 싶습니다.

지금까지 내가 한 일은 각 파일에 대한 모든 개별 경로가 포함된 텍스트 파일을 컴파일하는 것입니다.

몇 가지 경로 이름 예시:

/home/jennie/Pictures/DCIM/101APPLE/IMG_1703.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1431.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1933.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1388.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1954.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1524.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1897.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1582.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1007.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1502.JPG/5003.JPG

답변1

최종 파일 이름은 유연하게 지정할 수 있으며 이는 최신 스마트폰에서 가져온 사진이므로 exiftool사진을 자동으로 정리하고 이름을 바꾸는 것이 좋습니다.

  1. ~/Pictures/iPhone먼저, 필요할 때 항상 의지할 수 있도록 콘텐츠의 복사본/백업을 만드세요.
  2. exiftool다음 옵션을 사용하여 명령 프롬프트에서 실행합니다.
$ exiftool -P -r '-FileName<DateTimeOriginal' -d ~/outdir/%Y-%m-%d/%H/%Y-%m-%d_%H.%M.%S.%%e ~/Pictures/iPhone

이렇게 하면 사진이 삭제되고 ~/Pictures/iPhoneiPhone이 각 사진에 자동으로 삽입하는 EXIF ​​​​타임스탬프 데이터를 기반으로 사진을 재구성하고 이름을 변경한 다음 새로 생성된 ~/outdir디렉토리에 배치해야 합니다. 결과 디렉터리 경로와 이미지 파일 이름은 다음과 같습니다.

 ~/outdir/2016-01-03/10/2016-01-03_10.38.58.jpg

설치

그렇지 않은 경우 exiftool설치할 수 있습니다.

$ sudo apt-get install libimage-exiftool-perl

옵션

  • '-FileName<DateTimeOriginal'그것은 문자 그대로, 논쟁의 일부입니다
  • -d~/outdir선택한 다른 경로로 변경할 수 있는 대상 템플릿을 지정합니다.
  • 현재 %H/각 날짜 디렉터리 내에 시간별 하위 디렉터리를 추가로 생성하는 부분이 있습니다. 이와 같은 시간별 하위 디렉터리를 원하지 않으면 다음과 같이 시간 부분을 생략할 수 있습니다.~/outdir/%Y-%m-%d/%Y-%m-%d_%H.%M.%S.%%e
  • 또는 각 날짜에 대한 목차가 필요하지 않고 이미지만 직접 포함하려는 경우 ~/outdir날짜 목차 부분을 생략하고 다음을 수행하면 됩니다.~/outdir/%Y-%m-%d_%H.%M.%S.%%e

답변2

#!/bin/bash

appledir="$HOME/Pictures/DCIM/101APPLE"
jpgname="5003.JPG"

for   dir   in "$appledir"/*
do    if    [[ -d "$dir" ]]
      then
          newfile="$appledir/${dir##*/}"
          mv "$dir"/5003.JPG "$newfile.tmp" &&
          rmdir "$dir" &&
          mv "$newfile.tmp" "$newfile"
      fi
done

초기 트리는 다음과 같습니다.

$ tree Pictures/
Pictures/
└── DCIM
    └── 101APPLE
        ├── IMG_1002.JPG
        │   └── 5003.JPG
        ├── IMG_1003.JPG
        │   └── 5003.JPG
        └── IMG_1004.JPG
            └── 5003.JPG

스크립트( ./script.sh)를 실행하면 다음과 같은 트리가 됩니다.

$ tree Pictures/
Pictures/
└── DCIM
    └── 101APPLE
        ├── IMG_1002.JPG
        ├── IMG_1003.JPG
        └── IMG_1004.JPG

편집하다:

*.PNG파일 이름을 다시 바꾸 려면 *.JPG다음을 사용하십시오.

for     name   in "$HOME/Pictures/DCIM/101APPLE"/*.PNG
do      mv -i "$name" "${name%PNG}JPG"
done

답변3

한 줄로 사용할 수 있습니다.

find -name '*.JPG' | awk 'BEGIN{ i=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, i++ }'| bash 

예를 들어 /Pictures 폴더에서 사용하세요. 모든 JPG 파일을 검색한 후 awk 파이프라인이 소스를 가져와 4자리 카운터에 추가합니다. 우리는 이 파이프를 bash로 보냅니다.

답변4

예를 들면 이런 게 있어요.

cat list-of-files
path1/file1
path2/file1

우리는 할 수있어. a매번 변수를 재설정하는 것이 좋습니다 .

a=0; cat list-of-files |  while read -r f; do
  echo mv -v "$f" $((++a)).jpg
done 
mv -v path1/file1 1.jpg
mv -v path2/file1 2.jpg

에코 체크. 실제 삭제를 위해서는 삭제하세요.

관련 정보