거래는 이것이다. 내 여자친구는 내가 그녀의 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
사진을 자동으로 정리하고 이름을 바꾸는 것이 좋습니다.
~/Pictures/iPhone
먼저, 필요할 때 항상 의지할 수 있도록 콘텐츠의 복사본/백업을 만드세요.exiftool
다음 옵션을 사용하여 명령 프롬프트에서 실행합니다.
$ exiftool -P -r '-FileName<DateTimeOriginal' -d ~/outdir/%Y-%m-%d/%H/%Y-%m-%d_%H.%M.%S.%%e ~/Pictures/iPhone
이렇게 하면 사진이 삭제되고 ~/Pictures/iPhone
iPhone이 각 사진에 자동으로 삽입하는 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
에코 체크. 실제 삭제를 위해서는 삭제하세요.