두 파일 중 더 작은 파일을 삭제하는 방법을 찾고 있습니다. 내 영화 라이브러리에서 중복 파일을 찾는 방법을 찾았지만 이제 더 작은 파일을 삭제해야 합니다.
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#
추신: 이것이 "해킹적"이라고 확신하지만 이는 내 필요에 적합하며 학습 과정의 또 다른 단계입니다. :)