파일을 비교하고 더 큰 파일을 선택하세요.

파일을 비교하고 더 큰 파일을 선택하세요.

많은 파일이 포함된 두 개의 디렉토리가 있습니다. 해당 파일은 이름이 항상 일치하지만 크기가 항상 일치하는 것은 아닙니다. 예를 들어:

/dir1
|-file1 (1 MB)
|-file2 (2 MB)
|-file3 (3 MB)

/dir2
|-file1 (1 KB)
|-file2 (2 MB)
|-file3 (10 MB)

보시다시피 파일 이름은 일치하지만 파일 크기는 file2에서만 일치합니다. 어떻게 2개의 디렉토리에 있는 파일을 비교하고 더 큰 파일만 선택할 수 있습니까? 예제 사례의 출력은 "/dir2/file3"이어야 합니다.

dir1에 dir2에 있는 동일한 이름의 파일보다 큰 파일이 있으면 아무 작업도 수행하지 않습니다. 나는 dir1의 파일보다 큰 dir2의 파일에만 관심이 있습니다.

스크립트를 작성했지만 dir2에서 더 큰 파일이 하나 발견된 경우에만 작동합니다.

#!/bin/bash
diff -q $1 $2 | awk '{ print $2,$4 }' > tempfile.txt
A=`cat tempfile.txt | cut -d ' ' -f 1`
B=`ls -s $A | cut -d ' ' -f 1`
C=`cat tempfile.txt | cut -d ' ' -f 2`
D=`ls -s $C | cut -d ' ' -f 1`
if [ "$D" -gt "$B" ]; then
 echo $C
fi

답변1

#!/usr/bin/env zsh

zmodload -F zsh/stat b:zstat

for file2 in dir2/*(.); do
    file1="dir1/${file2##*/}"

    if [ -f "$file1" ] &&
       [ "$( zstat +size "$file2" )" -gt "$( zstat +size "$file1" )" ]
    then
        printf '%s is bigger than %s\n' "$file2" "$file1"
    fi
done

이것은 zsh내장 명령을 사용하여 zstat파일 크기를 이동적으로 가져오는 쉘 스크립트입니다.

스크립트는 디렉토리에 숨겨진 이름이 아닌 모든 일반 파일을 반복합니다 dir2. 각 파일 dir2에 대해 dir1. 의 파일이 dir1존재하고 일반 파일(또는 일반 파일에 대한 심볼릭 링크)인 경우 두 파일의 크기가 비교됩니다. 파일의 dir2크기가 더 크다면 짧은 메시지가 출력됩니다.

패턴은 dir2/*(.)디렉터리에 있는 일반 파일의 숨겨진 이름이 아닌 경우에만 일치합니다 dir2. 이는 일반 파일에만 일치하도록 하는 특정 수정자 (.)입니다 .zsh*

표현식은 마지막으로 제거된 항목을 포함하여 이전의 모든 항목과 함께 값을 포함하고 "dir1/${file2##*/}"시작하는 경로 이름으로 확장됩니다 . 이는 으로 변경될 수 있습니다 .dir1/$file2/"dir1/$( basename "$file2" )"

답변2

#!/bin/bash

get_attr() {
    # pass '%f' to $2 to get file name(s) or '%s' to get file size(s)
    find "$1" -maxdepth 1 -type f -printf "$2\n"
}

while read -r file
do
    (( $(get_attr "dir2/$file" '%s') > $(get_attr "dir1/$file" '%s') )) \
        && realpath -e "dir2/$file"
done < <(get_attr dir2 '%f')

이는 위에서 설명한 대로 의 모든 파일이 의 dir2파일과 이름이 동일하다고 가정합니다.dir1

realpath파일의 절대 경로를 인쇄합니다.

이 스크립트는 숨겨진 파일(로 시작하는 파일 .)도 비교합니다.

관련 정보