찾기를 사용하여 파일 이동 및 정리

찾기를 사용하여 파일 이동 및 정리

보안 카메라의 많은 파일을 포함하는 NAS/Homelab 서버로 사용되는 Debian GNU/Linux 12(bookworm) x86_64 서버에 폴더가 있습니다.

MDAlarm_20240301-091804.jpg
...
MDAlarm_20240316-153813.jpg
MDAlarm_20240327-183713.jpg

(예를 들어)를 사용하여 파일을 이동하려고 하면 mv snap/*.jpg /path/to/dest/2024/03다음과 같은 결과가 나타납니다.

-bash: /usr/bin/mv: Argument list too long

나는 다음과 같은 것을 생각하고 있었다이 답변 find snap -name '*202403??-??????.jpg' -exec mv -t /path/to/dest/2024/03 {} +예, 하지만 연도와 월에 적합한 폴더를 만드는 데 "한 줄"이 있습니까?

사진을 보고 정렬하기 위해 삼바 공유로 옮기고 있습니다.

답변1

첫째, 반드시 연도 및 월 폴더가 있을 필요는 없습니다. 다음을 사용하여 이동할 수 있습니다 find.

find snap -name '*202403??-??????.jpg' -exec mv -t /path/to/dest {} +

이제 날짜별로 정렬해야 하고 모든 파일이 있는 것처럼 보인다고 가정할 수 있다면 MDAlarm_날짜, a, -시간 순으로 .jpg공백이나 기타 이상한 문자 없이 정렬해야 합니다. 다음과 같이 할 수 있습니다:

outDir=/some/existing/directory
find snap -type f -name '*202403??-??????.jpg' | 
while read filename; do
  date=$(awk -F'[-_]' '{print $2}' <<<"$filename")
  read year month day < <(perl -pe 's/(....)(..)(..)/$1 $2 $3/' <<<"$date") 
  target="$outDir/$year/$month/$day"
  mkdir -p -- "$target" &&
     mv -- "$filename" "$target"
done

이는 또한 파일 이름 앞의 경로에 -또는 _문자가 없다고 가정합니다. 그래서 그렇게 하려고 했는데 그런 일이 생기면 snap/some-dir/MDAlarm_20240301-091804.jpg실패할 것입니다.

방법은 비교적 간단합니다. find명령을 실행한 다음 출력을 구문 분석합니다. 먼저 파일 이름에 있는 awk또는 필드 구분 기호를 사용하여 날짜를 얻습니다 . 파일이 항상 다음과 같으면 두 번째 필드는 날짜가 정의됩니다. 그래서 얻은 값.-_MDAlarm_20240301-whatever_-20240301date20240301

그런 다음 Perl 대체를 통해 처음 4자 뒤에 공백을 삽입하고 다음 두 문자 뒤에 공백을 삽입하고 다음 두 문자 뒤에 또 다른 공백을 삽입하여 전달됩니다. 따라서 이것은 , as 및 as 로 저장됩니다 20240301( 여기서는 표준 날짜를 가정하고 미국 스타일을 사용하는 경우 변수 이름의 순서를 변경하십시오).2024 03 01read2024$year03$month01$day

그런 다음 처음에 정의한 상위 디렉토리 udner를 $target사용하여 생성하려는 디렉토리의 이름을 담는 변수를 생성합니다. 마지막 단계에서는 성공을 가정하여 다른 디렉토리가 생성 됩니다(디렉토리가 이미 존재하지만 대상에 액세스할 수 없는 경우에는 해당 파일을 복사합니다.outDirmkdir -p

관련 정보