날짜 범위별로 사진을 카탈로그로 필터링

날짜 범위별로 사진을 카탈로그로 필터링

저는 찍은 모든 사진을 NAS(Qnap TS-231P)에 자동으로 백업하도록 가족 휴대폰을 설정했습니다. 휴대폰당 폴더 하나입니다. 어떤 이유에서인지 많은 사진이 경고 없이 여러 번 복사된 휴대폰. 또한 일부 사진은 대용량 파일과 마찬가지로 48MP 모드로 촬영된 것으로 보인다. 가지다314281개 파일, 총 2.19TB.

이제 폴더가 너무 커서 로드할 수 없고 실제로 탐색/사용할 수 없습니다(Windows, Qnap 소프트웨어, 휴대폰의 앱 등). SSH를 사용하여 NAS의 Linux OS에 액세스했으며 적절한 디렉터리로 이동할 수 있습니다. 디렉토리를 시도했지만 du -h40분 후에도 여전히 생각 중이었습니다(위의 크기는 Qnap 소프트웨어에서 가져온 것입니다).

이 파일에는 실제 문제가 없다고 생각하므로 파일을 여러 폴더에 넣는 것이 도움이 될 수 있습니다.

월별 폴더, 분기별 폴더 등 수정 날짜별로 파일을 필터링하는 명령을 어떻게 입력하나요?

보너스 포인트를 얻으려면 작업을 수행하기 전에 보고서를 314281 파일로 가져올 수 있습니까(예: .txt 또는 .csv로 내보내기)?

저는 Linux를 처음 사용하므로 양해해 주시기 바랍니다.

답변1

나는 다음과 같은 것을 가지고 있습니다

2019년 4월부터 비슷한 목적으로 쉘스크립트를 사용하고 있어서 테스트가 잘 되었습니다.

  • 내 데이터 파티션의 마운트 지점에 대해 하드코딩되어 있습니다. 수정해야합니다.

  • 파일 이름을 소문자로 이동합니다. 건너뛰고 싶을 수도 있습니다.

  • 보유한 파일 수가 너무 많아서 최적화되지 않았습니다. 어쩌면 너무 느리기 때문에 더 빠르게 만들기 위해 조정해야 할 수도 있습니다. 어쩌면 병렬 처리를 사용할 수도 있습니다.

  • "main"의 find 명령과 그 주변의 명령은 시간 낭비일 뿐입니다. 적어도 대규모 초기 배치 작업의 경우에는 이를 제거해야 한다고 생각합니다. (요청하신 리포트일지도 모르지만 시간낭비일 뿐이라고 생각합니다.)

  • 파일이 이동된 위치에 동일한 이름을 가진 다른 파일이 발견되면 대화형입니다. 적어도 대규모 초기 배치 작업의 경우 속도를 향상시키기 위해 이를 제거할 수 있습니다.

  • mv이 명령은 동일한 파일 시스템 내에서 이동할 때는 빠르지만 파일 시스템 간(파티션 간)을 이동(복사 및 삭제)할 때는 속도가 느립니다 .

수정 후 큰 작업을 시작하기 전에 소수의 파일을 테스트하십시오.

pict2dirtree:

#!/bin/bash


function doit {

 fildir=$(find -name "$1" -printf "%TY/%Tm/%Td")
 lcas=${1##.*}
 lcas=${lcas,,}
 fildir="/media/multimed-2/Photos/$fildir"
 mkdir -p "$fildir"
 filnam="$fildir/${lcas}"
#echo "fildir=$fildir"
#echo "filnam=$filnam"
#echo "$lcas"
#exit
 if test -s "$filnam"
 then
  diff -q "$1" "$filnam"
  if [ $? -eq 0 ]
  then
   rm "$1"
  else
   read -p "move to '_$lcas' (y/N) " ans
   if [ "$ans" == "y" ]
   then
    mv -i "$1" "${fildir}/_$lcas"
   fi
  fi
 else
  mv "$1" "$filnam"
 fi
}

########################################################################

# main

########################################################################

if [ "$(whoami)" == "root" ]
then
 echo "Usage: Do *not* run with sudo"
 exit
fi

find -maxdepth 1 -type f -exec ls -l --time-style=long-iso "{}" \;|tr -s ' ' ' '|cut -f 6,8|sort|more
echo "Move files from the current directory (no subdirectories)"
read -p "Are you ready to move these files (y/N) " ans
if [ "$ans" != "y" ]
then
 exit
fi

for i in *
do
 if test -f "$i"
 then
  doit "$i"
 else
  echo "skipping $i"
 fi
done

관련 정보