![날짜 범위별로 사진을 카탈로그로 필터링](https://linux55.com/image/198097/%EB%82%A0%EC%A7%9C%20%EB%B2%94%EC%9C%84%EB%B3%84%EB%A1%9C%20%EC%82%AC%EC%A7%84%EC%9D%84%20%EC%B9%B4%ED%83%88%EB%A1%9C%EA%B7%B8%EB%A1%9C%20%ED%95%84%ED%84%B0%EB%A7%81.png)
저는 찍은 모든 사진을 NAS(Qnap TS-231P)에 자동으로 백업하도록 가족 휴대폰을 설정했습니다. 휴대폰당 폴더 하나입니다. 어떤 이유에서인지 많은 사진이 경고 없이 여러 번 복사된 휴대폰. 또한 일부 사진은 대용량 파일과 마찬가지로 48MP 모드로 촬영된 것으로 보인다. 가지다314281개 파일, 총 2.19TB.
이제 폴더가 너무 커서 로드할 수 없고 실제로 탐색/사용할 수 없습니다(Windows, Qnap 소프트웨어, 휴대폰의 앱 등). SSH를 사용하여 NAS의 Linux OS에 액세스했으며 적절한 디렉터리로 이동할 수 있습니다. 디렉토리를 시도했지만 du -h
40분 후에도 여전히 생각 중이었습니다(위의 크기는 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