두 파일 크기를 비교하고 더 작은 파일을 삭제합니다.

두 파일 크기를 비교하고 더 작은 파일을 삭제합니다.

두 파일 중 더 작은 파일을 삭제하는 방법을 찾고 있습니다. 내 영화 라이브러리에서 중복 파일을 찾는 방법을 찾았지만 이제 더 작은 파일을 삭제해야 합니다.

bash - 확장자에 관계없이 동일한 이름을 가진 모든 파일 찾기

물론 몇 가지 "문제"가 있습니다. 목록의 현재 출력에는 확장자가 없습니다.

예를 들어:

root@fs:ls * |  awk '!/.srt/'  | sed 's/.\{4\}$//' | sort | uniq -d
Captain Fantastic (2016)
The Hurt Locker (2008)
The Warriors (1979)

Captain Fantastic (2016).*두 파일의 확장자가 다르기 때문에 돌아가서 두 파일을 이름과 비교할 수 있는 방법이 필요합니다 . (모든 파일은 같은 폴더에 있습니다)

이것은 질문의 범위를 약간 벗어납니다.

또한 파일이 존재하는지 확인하고 싶습니다 FILENAME.srt. 그렇다면 아무 작업도 수행하지 않고 수동 확인을 위해 파일 이름을 로그에 저장합니다. (어떤 파일 srt가 동기화되는지 알아내야 합니다).

답변1

제안:

#!/bin/sh

# Look at filenames in current directory and generate list with filename
# suffixes removed (a filename suffix is anything after the last dot in
# the file name). We assume filenames that does not contain newlines.
# Only unique prefixes will be generated.
for name in ./*; do
        [ ! -f "$name" ] && continue # skip non-regular files
        printf '%s\n' "${name%.*}"
done | sort -u |
while IFS= read -r prefix; do
        # Set the positional parameters to the names matching a particular prefix.
        set -- "$prefix"*

        if [ "$#" -ne 2 ]; then
                printf 'Not exactly two files having prefix "%s"\n' "$prefix" >&2
                continue
        fi

        # Check file sizes and remove smallest.
        if [ "$( stat -c '%s' "$1" )" -lt "$( stat -c '%s' "$2" )" ]; then
                # First file is smaller
                printf 'Would remove "%s"\n' "$1"
                echo rm "$1"
        else
                # Second file is smaller, or same size
                printf 'Would remove "%s"\n' "$2"
                echo rm "$2"
        fi
done

이는 GNU 를 가정합니다 stat.

답변2

글쎄, 이것은 Re: Kusalananda의 의견에서 내 질문에 구체적으로 대답합니다. 2개 이상의 파일을 찾으면 모든 것이 망가지고 잘못된 파일이 삭제됩니다. 이 스크립트는 내 필요에 맞게 조정되었지만 다른 목적으로도 사용할 수 있습니다.

#!/bin/bash

#Create Log with Single Entry for Each Duplicate Without File Extension
duplog='dupes.log'
ls * |  awk '!/.srt/'  | sed 's/.\{4\}$//' | sort | uniq -d > "$duplog"

#Testing!
cat "$duplog"

#List Each Iteration of File in log starting with Largest File
log='tmp.log'
while read p; do

#More Testing!
du -k "$p".*

ls -1S  "$p".* >> "$log"
done < $duplog

#Testing!
cat "$log"

#Remove Large File Entry via Sed
#Note: This relies on only two variations being found or it will delete wrong lines in file
sed -i '1~2d' "$log"

#Testing!
cat "$log"

#Delete Smaller File
while read p; do
  echo "Deleting $p"
  rm "$p"
done <"$log"

#Delete Log
rm "$log"

산출:

root@fs:/Movies# du -k tk.m*
4       tk.mkv
0       tk.mp4
root@fs:/Movies# ./test.sh
tk
4       tk.mkv
0       tk.mp4
tk.mkv
tk.mp4
tk.mp4
Deleting tk.mp4
root@fs:/Movies#

추신: 이것이 "해킹적"이라고 확신하지만 이는 내 필요에 적합하며 학습 과정의 또 다른 단계입니다. :)

관련 정보