![파일을 비교하고 더 큰 파일을 선택하세요.](https://linux55.com/image/146729/%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%B9%84%EA%B5%90%ED%95%98%EA%B3%A0%20%EB%8D%94%20%ED%81%B0%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%84%A0%ED%83%9D%ED%95%98%EC%84%B8%EC%9A%94..png)
많은 파일이 포함된 두 개의 디렉토리가 있습니다. 이러한 파일의 이름은 항상 일치하지만 크기는 항상 일치하지 않습니다. 예를 들어:
/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
인쇄 파일의 절대 경로입니다.
스크립트는 숨겨진 파일(로 시작하는 파일 .
)도 비교합니다.