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

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

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

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

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

보시다시피 파일 이름은 일치하지만 파일 크기는 file2에서만 일치합니다. 이 두 디렉토리의 파일을 비교하고 더 큰 파일만 선택하려면 어떻게 해야 합니까? 예제의 출력은 "/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인쇄 파일의 절대 경로입니다.

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

관련 정보