확장명 [중복]을 기반으로 디렉터리(및 하위 디렉터리)의 모든 파일을 새 폴더로 이동하는 스크립트

확장명 [중복]을 기반으로 디렉터리(및 하위 디렉터리)의 모든 파일을 새 폴더로 이동하는 스크립트

micro-sd 카드를 복원하려면 photorec을 사용해야 합니다. 여러 파일 확장자를 포함하는 다른 많은 디렉터리가 포함된 디렉터리가 남았습니다. 파일 확장자를 기반으로 각 파일을 새 디렉터리로 이동하고 싶습니다.

*.jpg /SortedDir/jpg 디렉토리로 이동

*.gif가/SortedDir/gif 디렉토리로 이동되었습니다.

확장자나 *.<'blank>가 없는 원시 파일도 고려하세요.

Windows에서 일괄적으로 이 작업을 성공적으로 수행했습니다.

@Echo OFF

Set "Folder=C:\MessyDir"
Set "DestDir=C:\SortedDir"

FOR /R "%Folder%" %%# in ("*") DO (
    If not exist "%DestDir%\%%~x#" (MKDIR "%DestDir%\%%~x#")
    Echo [+] Moving: "%%~nx#"
    Move "%%#" "%DestDir%\%%~x#\" 1>NUL
)

Pause&Exit

Linux 스크립트 버전을 찾고 있습니다.

감사해요! !

답변1

정렬되지 않은 모든 파일이 에 있고 messy_dir하위 디렉터리가 에 있다고 가정하면 sorted_dir다음을 수행할 수 있습니다.

(cd sorted_dir; mkdir jpg gif)
find messy_dir -type f \( -iname '*.jpg' -exec mv {} ../sorted_dir/jpg/ \; -o \
                          -iname '*.gif' -exec mv {} ../sorted_dir/gif/ \; \)

이는 개선될 수 있지만 좋은 출발점이 됩니다.


스크립트를 원하면 다음을 시도하십시오.

#!/bin/bash

# Check assumptions
[ "$#" -eq 2 ] || exit 1
[ -d "$1" ] || exit 1

find "$1" -type f -name '*?.?*' -exec sh -c '
    mkdir -p "$2/${1##*.}" && mv "$1" "$2/${1##*.}"
' find-sh {} "$2" \;

답변2

일부 매개변수를 사용하세요.

#!/bin/bash

# collect directory names
MessyDir="$1"
SortedDir="$2"

# test if user supplied two arguments
if [ -z $2 ]; then
    echo "Error: command missing output directory" 
    echo "Usage: $0 input_dir output_dir" 
    exit 1
fi

# read recursively through MessyDir for files 
find $MessyDir -type f | while read fname; do

    # form out_dir name from user supplied name and file extension
    out_dir="$SortedDir/${fname##*.}"

    # test if out_dir exists, if not, then create it
    if [ ! -d "$out_dir" ]; then
        mkdir -p "$out_dir"
    fi

    # move file to out_dir
    mv -v "$fname" "$SortedDir/${fname##*.}"

done

이는 필요한 것보다 더 많은 시간이 소요되며 변수 확장 ${fname##*}으로 인해 Bash 4 이상이 필요합니다. 이렇게 하면 basename 호출을 피하고 photorec에서 잘 작동합니다. 또한 이 스크립트는 jpg 및 gif뿐만 아니라 photorec에서 내보낸 모든 파일 형식에서 작동합니다.

관련 정보