파일 이름은 동일하지만 크기가 다른 중복 파일 제거

파일 이름은 동일하지만 크기가 다른 중복 파일 제거

폴더_1

./a20160606_000000_000021.txt    5KB                                              
./a20160606_000000_000062.txt    5KB  
./a20160606_000000_000531.txt    5KB  
./a20160606_000000_004521.txt    5KB  
./a20160606_000000_003211.txt    9KB  
./a20160606_000000_009451.txt    9KB  
./b20160606_000000_000001.txt    4KB  
./b20160606_000000_000311.txt    6KB  
./b20160606_000000_000632.txt    8KB  
./b20160606_000000_000008.txt    9KB  
./b20160606_000000_000034.txt    12KB  
./b20160606_000000_000245.txt    12KB  
./b20160606_000000_000333.txt    12KB

폴더_2

./a20160607_000000_000001.txt    9KB                                              
./a20160607_000000_000002.txt    9KB  
./a20160607_000000_000311.txt    9KB  
./a20160607_000000_000500.txt    9KB  
./a20160607_000000_001121.txt    9KB  
./a20160607_000000_004891.txt    9KB  
./b20160607_000000_000021.txt    5KB  
./b20160607_000000_000065.txt    5KB  
./b20160607_000000_000091.txt    5KB  
./b20160607_000000_000134.txt    12KB  
./b20160607_000000_000521.txt    12KB  
./b20160607_000000_001111.txt    12KB

각 폴더에는 위의 파일이 포함되어 있습니다. 각 파일의 크기는 오른쪽에 표시됩니다(folder_1과 Folder_2는 동일한 폴더에 있음). 내 질문은 이러한 중복 파일을 제거하는 방법이며 find파일은 각 파일 중 가장 큰 파일이어야 합니다. 출력은 다음과 같아야 합니다.

폴더_1

./a20160606_000000_009451.txt    9KB  
./b20160606_000000_000333.txt    12KB

폴더_2

./a20160607_000000_000001.txt    9KB   
./b20160607_000000_001111.txt    12KB

답변1

귀하의 질문에 엄격하게 답변하기 위해 파일 이름을 기준으로 중복된 파일이 없습니다.

파일 이름의 첫 번째 부분을 기준으로 가장 큰 파일을 유지하려면 다음 awk스크립트를 사용하여 접두사(a20160606, a20160607 등)를 기준으로 가장 큰 파일이 아닌 파일 이름(및 해당 크기)을 가져올 수 있습니다. 첫 번째 밑줄 앞에 ):

find . -maxdepth 1 -type f -printf "%f %s\n"| awk '{
NAME=substr($1,0,9)
    SIZES[$1]=$2
    if ($2 > MAX[NAME]) {
        MAX[NAME]=$2
    }
}

END {
    for (x in SIZES) {
        for (y in MAX) {
            if (match(x,y) && SIZES[x] != MAX[y]) {
                printf "%s %d\n", x, SIZES[x]
            }
        }
    }
}'

발견된 가장 큰 값의 이름(및 크기) 목록을 얻으려면 다음을 사용하십시오.

find . -maxdepth 1 -type f -printf "%f %s\n"| awk '{
    NAME=substr($1,0,9)
    SIZES[$1]=$2
    if ($2 > MAX[NAME]) {
        MAX[NAME]=$2
    }
}

END {
    for (x in SIZES) {
        for (y in MAX) {
            if (match(x,y) && SIZES[x] == MAX[y]) {
                printf "%s %d\n", x, SIZES[x]
            }
        }
    }
}'

이를 수행하는 더 쉬운 방법이 있을 수 있지만 삭제할 파일 목록을 얻는 데 도움이 될 수 있습니다.

관련 정보