"중복" 파일 쉘 스크립트 제거

"중복" 파일 쉘 스크립트 제거

다음과 같은 파일 목록이 있습니다.

file.txt
file (1).txt
file (2).txt
file (7).txt

등.

그 중 큰(숫자) 것이 마지막으로 업데이트된 파일이지만 중간 숫자 중 일부가 누락될 수 있으며 디렉토리에 다른 파일이 있을 수 있습니다.

"중복" 파일이 있는지 어떻게 확인하고, 그렇다면 내용을 에 복사하고 file (maxnumer).txt모든 file.txt파일을 삭제합니다 file (*).txt.

ls -t file*(*)*.txt목록을 나열한 다음 반복을 시도했지만 for오류( )가 발생했습니다 ls.bash:syntax error near unexpected token '('

답변1

타임스탬프가 신뢰할 수 없다고 가정하면 파일 이름 끝에 괄호 안에 가장 큰 숫자가 있는 파일을 찾으려고 합니다.

이 방법:

#!/bin/sh

prefix=$1

if [ -z "$prefix" ]; then
    printf 'Usage: %s prefix [ suffix ]\n' "$0" >&2
    exit 1
fi

suffix=$2

for filename in "$prefix ("*")$suffix"; do
    [ ! -f "$filename" ] && continue

    num=${filename##*\(}    # "file (xx).txt" --> "xx).txt"
    num=${num%\)*}          # "xx).txt" --> "xx"

    # if no max number yet, or if current number is higher, update max
    if [ -z "$max" ] || [ "$num" -gt "$max" ]; then
        max=$num
    fi
done

# if we have a max number, use it to rename the file and then remove the other files
if [ -n "$max" ]; then
    printf 'Would move %s to %s\n' "$prefix ($max)$suffix" "$prefix$suffix"
    # mv "$prefix ($max)$suffix" "$prefix$suffix"
    printf 'Would remove %s\n' "$prefix ("*")$suffix"
    # rm "$prefix ("*")$suffix"
else
    printf 'Found no files matching "%s (*)%s"\n' "$prefix" "$suffix"
fi

실행하세요:

$ tree
.
|-- file (1).txt
|-- file (2).txt
|-- file (7).txt
|-- file.list
|-- file.txt
`-- script.sh

0 directory, 6 files

$ sh script.sh file .txt
Would move file (7).txt to file.txt
Would remove file (1).txt
Would remove file (2).txt
Would remove file (7).txt

(댓글을 삭제 mv하고 rm실제로 파일을 수정해보세요)

file (2) (30).txt모든 파일 이름이 정수인 패턴을 따른다고 가정하기 때문에 (이것들도 일치함)와 같은 파일 이름에 대해서는 실패합니다 .prefix (NN)suffixNN

관련 정보