CentOS/cPanel 서버에 24000개의 이미지가 있는 디렉토리(currdir)가 있습니다.
날짜를 기준으로 이 디렉토리의 이미지를 다른 디렉토리(또는 currdir 내의 하위 디렉토리)로 이동하여 이 디렉토리를 분할하고 싶습니다.
달성하는 방법?
답변1
find
그러면 마지막으로 변경된 시간을 기준으로 디렉터리의 파일을 이동하는 쉘 명령을 출력하는 명령이 실행됩니다 . 디렉터리에 대상을 동적으로 생성합니다( mkdir -p
디렉토리가 이미 존재하는 경우 실패하지 않음). 생성된 명령은 쉘 인터프리터로 직접 파이프됩니다.
find . -maxdepth 1 -type f -printf "mkdir -p %CY/%Cm/%Cd && mv -- '%f' %CY/%Cm/%Cd\n" | sh
(GNU를 조건 find
자로 가정 -printf
).
마지막 수정 시간으로 대체됨(일반적으로 파일 수명을 보다 정확하게 나타냄 %C
)%T
콘텐츠파일의 메타데이터가 수정되면 변경 시간도 업데이트됩니다.
이는 디렉터리를 생성하고 파일을 이동하는 데 많은 프로세스를 생성하므로 가장 효율적인 방법이 아닐 수 있습니다. 이건 처형이니까 별로 집중하진 않겠습니다...
파일 이름에 '
문자가 포함되어 있지 않다고 가정합니다(이것이 보장되지 않으면 명령 주입 취약점이 됩니다).
-x
옵션 ( 또는 -o xtrace
) 을 전달 sh
하여 수행 중인 작업을 표시하거나 -e
( 또는 -o errexit
)를 전달하여 첫 번째 오류 시 종료되도록 할 수 있습니다(비록 을 사용하더라도 해당 항목을 교체 -e
하고 싶거나 그렇지 않으면 실패가 무시됩니다).&&
;
mkdir
답변2
그리고 exiftool
:
exiftool -ext jpg '-Directory<FileModifyDate' -d %Y/%m/%d .
현재 작업 디렉토리에 있는 확장자를 가진 파일 jpg
을 FileModifyDate
.
exiftool -args file.jpg
사용할 수 있는 파일과 관련된 추가 타임스탬프가 표시됩니다 FileModifyDate
(카메라가 JPEG 파일에 저장한 EXIF 메타데이터의 타임스탬프 포함)(예 FileInodeChangeDate
: FileAccessDate
, ModifyDate
, DateTimeOriginal
, ) CreateDate
.