파일 유형에 따라 파일을 폴더로 정렬

파일 유형에 따라 파일을 폴더로 정렬

약 2.8TB(예, 테라바이트)의 데이터를 복구했습니다. 중복된 항목이 있는지 검사합니다. 이 파일이 있는 시스템은 꽤 오래되었고 RAM이 2GB밖에 없습니다(그러나 LVM에서는 제대로 작동함). 따라서 다음 작업이 반복됩니다. 그것을 스캔하는 것은 고통을 추구하는 것입니다.

내 질문은 파일 형식 목록을 지정하지 않고도 데비안에서 파일을 해당 파일 형식의 폴더로 이동하고 필요할 때 자동으로 이름을 바꾸도록 하는 방법입니다.

약 800GB의 여유 공간이 있으므로 데이터를 실행하기 전에 몇 가지 테스트를 수행할 수 있습니다.

답변1

나는 Stephen의 코드를 스크립트로 래핑하고 파이프라인을 약간 개선했습니다.

#!/bin/bash 
set -e 
set -u 
set -o pipefail

start=$SECONDS

exts=$(ls -dp *.*| grep -v / | sed 's/^.*\.//' | sort -u) # not folders
ignore=""

while getopts ':f::i:h' flag; do
  case "$flag" in
    h)
        echo "This script sorts files from the current dir into folders of the same file type. Specific file types can be specified using -f."
        echo "flags:"
        echo '-f (string file types to sort e.g. -f "pdf csv mp3")'
        echo '-i (string file types to ignore e.g. -i "pdf")'
        exit 1
        ;;
    f)
        exts=$OPTARG;;
    i)
        ignore=$OPTARG;;
    :) 
        echo "Missing option argument for -$OPTARG" >&2; 
        exit 1;;
    \?)
        echo "Invalid option: -$OPTARG" >&2
        exit 1
        ;;
  esac
done

for ext in $exts 
do  
    if [[ " ${ignore} " == *" ${ext} "* ]]; then
        echo "Skiping ${ext}"
        continue
    fi
    echo Processing "$ext"
    mkdir -p "$ext"
    mv -vn *."$ext" "$ext"/
done

duration=$(( SECONDS - start ))
echo "--- Completed in $duration seconds ---"

답변2

디렉토리는 다음과 같습니다

$ ls   
another.doc  file.txt  file1.mp3  myfile.txt

다음 명령을 사용하여 파일 확장자 목록을 작성할 수 있습니다.

$ exts=$(ls | sed 's/^.*\.//' | sort -u)

그런 다음 이러한 확장명을 반복하여 파일을 하위 디렉터리로 이동할 수 있습니다.

$ for ext in $exts
> do
> echo Processing $ext
> mkdir $ext
> mv -v *.$ext $ext/
> done

실행하면 다음과 같은 출력을 얻습니다.

Processing doc
'another.doc' -> 'doc/another.doc'
Processing mp3
'file1.mp3' -> 'mp3/file1.mp3'
Processing txt
'file.txt' -> 'txt/file.txt'
'myfile.txt' -> 'txt/myfile.txt'

결과:

$ ls
doc/  mp3/  txt/

$ ls *
doc:
another.doc

mp3:
file1.mp3

txt:
file.txt  myfile.txt

관련 정보