최신 파일을 선택하고 이름별로 그룹화

최신 파일을 선택하고 이름별로 그룹화

다음과 같은 이름 구조의 파일이 포함된 디렉터리가 있습니다.

<device>.<yyyy-mm-dd-hh-mm-ss> 

각 장치에 대해 이러한 구성 백업의 마지막 X 복사본을 보관하는 스크립트를 작성 중입니다. 이것을 달성하려면 어떤 종류의 선택 마법이 필요합니까?

BASH를 고려하고 있지만 실제로는 언어에 구애받지 않습니다.

답변1

와일드카드 문자는 파일 이름을 사전순으로 확장합니다. 날짜 형식이 사전순으로 일치하므로 요구 사항은 와일드카드의 마지막 X 일치 항목(또는 X보다 작은 경우 모든 일치 항목)을 유지하는 것으로 요약됩니다. 귀하의 백업이 일치하는 파일이라고 가정하고 $device.*필요에 따라 패턴을 조정하십시오.

zsh에서:

set -- $device.*
if [[ $# -gt $X ]]; then set -- $@{[-$X,-1]}; fi
cp -- $@ /retain/area/

Bourne 스타일 쉘(ash, bash, ksh...)에서:

set -- "$device".*
if [ $# -gt $X ]; then shift $(($#-$X)); fi
cp -- "$@" /retain/area

실제로 오래된 파일을 삭제하려면 X를 제외한 첫 번째 일치에서 삭제해야 합니다(X보다 적으면 일치하지 않습니다).

zsh에서:

files=($device.*)
rm -f -- $files[1,-$X-1]

다른 쉘에서는:

set -- "$device".*
while [ $# -gt $X ]; do
  rm -- "$1"
  shift
done

답변2

ls기본적으로 어휘순으로 정렬되는 파일 이름을 활용하세요 .

ls | awk -F . '
    $1 != current_device {
        current_device = $1
        n5[$1] = n4[$1]
        n4[$1] = n3[$1]
        n3[$1] = n2[$1]
        n2[$1] = n1[$1]
        n1[$1] = $0
    }
    END {
        for (device in n1) {
            print n1[device]
            print n2[device]
            print n3[device]
            print n4[device]
            print n5[device]
        }
    }
'

장치 이름에 점이 포함되어 있지 않다고 가정합니다. 결과가 정렬되지 않을 수 있습니다.

답변3

그러나 일부 변경이 필요할 수 있습니다.

ls <DEVICE>.* | sort -r | tail -n +<X+1> | xargs echo rm 

그러면 rm 문이 출력되고 "echo"가 제거되고 직접 삭제됩니다.

관련 정보