수백만 개의 파일을 더 이상 사용되지 않는 폴더로 이동

수백만 개의 파일을 더 이상 사용되지 않는 폴더로 이동

Mac 폴더에 거의 1,000,000개의 .mp4 보안 비디오가 저장되어 있으며 생성 날짜별로 다음과 같은 별도의 폴더로 이동해야 합니다.보안 비디오 MM-DD-YY".

예를 들어 생성 날짜가 2021년 2월 1일인 모든 파일은 새로 생성된 폴더안전영상 02-01-21",등.

프로세스가 끝나면 이 원시 폴더에는 날짜가 지정된 폴더가 수백 개만 표시되고 수백만 개의 비디오 파일이 날짜를 기준으로 보다 합리적인 그룹으로 배포될 것으로 예상됩니다.

원래는 Applescript를 사용하여 이 작업을 수행하려고 했으나 상상할 수 있듯이 시간이 초과되어 기본적으로 전체 노트북이 차단되었습니다. 터미널에서 bash 스크립트를 실행하면 이 문제가 해결될 것이라고 들었지만 작성 방법이 전혀 익숙하지 않습니다.

답변1

예를 들어 date -r.

cd /path/to/mp4-files/
for f in *.mp4; do
    date=$(date +%F -r "$f")
    y=${date:0:4}
    m=${date:5:2}
    d=${date:8:2}
    target="Security Videos $y/Security Videos $y-$m/Security Videos $y-$m-$d"
    mkdir -p "$target"
    mv "$f" "$target"
done

맥 버전:

cd /path/to/mp4-files/
for f in *.mp4; do
    date=$(stat -f %Sm -t %Y-%m-%d "$f")
    y=${date:0:4}
    m=${date:5:2}
    d=${date:8:2}
    target="Security Videos $y/Security Videos $y-$m/Security Videos $y-$m-$d"
    mkdir -p "$target"
    mv "$f" "$target"
done

답변2

파일 수가 너무 많은 경우 find | xargs사용할 패턴은 다음과 같습니다.

find . -type f -name \*.mp4 -print0 \
| xargs -0 bash -c '
    pattern="([0-9]{4})/([0-9]{2})/([0-9]{2}) [|] (.*)"
    for file; do
       [[ $file =~ $pattern ]] || continue
        year=${BASH_REMATCH[1]}
        mon=${BASH_REMATCH[2]}
        day=${BASH_REMATCH[3]}
        dir="Security Videos $year-$mon-$day"
        mkdir -p "$dir"
        mv -v "$file" "$dir/${BASH_REMATCH[4]}"
    done
' sh

bash는 후행 "sh"를 $0으로 사용하여 for file$1, $2, ...를 반복합니다.

답변3

아래에서는 "ExifTool"을 사용하여 요청한 대부분의 작업을 수행합니다. 에서 다운로드 가능https://exiftool.org/또는 homebrew를 사용하여 Mac에 설치합니다 brew install exiftool. ExifTool은 디지털 이미지에 포함된 EXIF ​​​​메타데이터 "교환 가능한 이미지 파일 형식"을 읽고 해당 정보를 사용하여 파일 이름을 바꾸고 디렉터리를 만들고 이미지를 이동할 수 있습니다. 웹사이트와 매뉴얼 페이지에는 광범위한 문서와 사용법 예제가 있습니다.

터미널을 열고 mp4가 있는 디렉터리에서 다음 명령을 실행합니다.

exiftool -d %Y%m%d-%H%M%S.%%e '-Filename<'CreateDate' *mp4

그러면 파일 이름이 20191214-165635.mp4와 같은 이름으로 변경됩니다.

그런 다음 실행

exiftool -r -d %Y/%m/%d '-directory<$CreateDate/%d' .

그러면 디렉터리 구조가 생성됩니다(예: "2021/02/05/").

그리고 각 mp4를 날짜를 기준으로 폴더에 넣습니다.

ls사용된 날짜는 MacOS Finder에 표시된 날짜 가 아니라 파일에 포함된 메타데이터에서 나온 것입니다 . 이미지 처리 또는 기타 파일 작업을 수행한 경우 후자의 날짜는 이미지 생성 날짜가 아닌 해당 작업을 반영합니다. 안전한 영상을 위해서는 정확한 제작일자가 중요하다고 생각합니다.

EXIF 태그는 카메라 모델에 따라 다릅니다. 귀하의 날짜에는 "생성 날짜" 대신 "원래 날짜/시간"이 있을 수 있습니다. 그렇다면 위 명령의 "CreateDate"를 공백이나 백슬래시 없이 카메라의 해당 레이블로 바꾸세요. EXIF ​​데이터를 보려면 를 실행하십시오 exiftool example_filename.mp4. 그러면 모든 EXIF ​​​​태그가 덤프됩니다. 날짜가 있는 콘텐츠만 보려면 를 실행합니다 exiftool example_file.mp4 | grep -i date.

백만 개의 파일을 처리하는 데는 파일 크기에 따라 시간이 오래 걸립니다. 다음 스크립트는 500개 파일의 하위 집합을 무작위로 선택하여 "tmp" 하위 디렉터리에 배치합니다. mp4와 동일한 디렉토리에 생성하고 실행 가능하게 만든 다음 chmod u+x select_files.sh실행합니다 ./select_files.sh. 디렉터리( cd tmp)로 이동하고 위의 EXIFtool 명령을 실행하여 원하는 작업이 수행되는지 확인합니다.

#!/bin/bash

#
# select_files.sh - Copy a random selection of files to subdirecotry 'tmp'
#

ext="mp4"                       # File extension
num=500                         # Number of files to select

ls *.${ext} | sort -R | head -n $num > random_files.txt

mkdir tmp

while read -r file ; do
    cp $file ./tmp
done < random_files.txt

# End

관련 정보