
많은 파일이 포함된 두 개의 디렉토리가 있습니다. 해당 파일은 이름이 항상 일치하지만 크기가 항상 일치하는 것은 아닙니다. 예를 들어:
/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
파일의 절대 경로를 인쇄합니다.
이 스크립트는 숨겨진 파일(로 시작하는 파일 .
)도 비교합니다.