파일의 각 줄마다 카운터 변수를 고유하게 만드는 방법

파일의 각 줄마다 카운터 변수를 고유하게 만드는 방법

따라서 동일한 파일이 있는 2개의 디렉터리가 있습니다. 단, 디렉터리 a에는 오늘의 데이터가 있고 디렉터리 b에는 어제의 데이터가 있습니다. 내가 원하는 것은 파일을 비교하고 결과를 3개의 열로 출력하는 것입니다. 이는 파일 이름, 파일이 동일한지 여부, 파일이 동일한 일수입니다.

내가 지금까지 가지고 있는 것은 다음과 같습니다.

ls ./dropzone_current > files.txt

is_identical=false


filename="files.txt"
while read -r line
do
    name="$line"
    declare -i counter 
    diff -qs ./dropzone_current/$name ./dropzone_backup/$name
    if [ $? -ne 0 ]
    then
    is_identical=false
    counter=0
    printf '%s\t%s\t%s\n' "$name" "$is_identical" "$counter" >> test.txt

    else
    counter=$((counter + 1))
    is_identical=true
    printf '%s\t%s\t%s\n' "$name" "$is_identical" "$counter" >> test.txt
    fi


done < "$filename"

기본적으로 카운터를 제외한 모든 것이 잘 작동합니다. 비교되는 각 파일 이름에 대해 카운터가 고유해야 하고 스크립트가 실행될 때마다(하루에 한 번) 업데이트되어야 하지만 이를 수행하는 방법을 알 수 없습니다.

답변1

내 다른 답변과 귀하의 질문에 대한 의견을 바탕으로 귀하가 실제로 찾고 있는 것은 파일 세트의 변경 사항을 추적하는 방법인 것 같습니다. 이를 종종 버전(또는 개정) 제어라고 합니다. 일반적으로 시스템에 설치되는 일반적인 엔진 중 하나는 git.

이를 달성하려면 파일 복사본을 저장하고 그 안의 모든 변경 사항을 추적하는 "저장소"를 저장할 위치를 선택하세요. 우리는 이것을 위치라고 부릅니다 /path/to/repository. 디렉터리를 만들고 명령을 실행합니다 git init. 그러면 저장소가 설정됩니다. 파일을 디렉터리에 복사하면 이제 현재 상태를 저장소에 "커밋"합니다.

git add *
git commit -m "Initial commit of files"

그런 다음 전달 위치를 확인하고 필요한 경우 저장소를 업데이트할 수 있습니다.

#!/bin/bash
repo='/path/to/repository'
dropbox='/path/to/delivery/'

cd $repo
for file in *; do
    if ! diff "${repo}/$file" "${dropbox}/$file"; then
        cp -p "${dropbox}/$file" ${repo}/
        git add "$file"
    fi
done
git commit -m "Update for $(date)"

이것은 이름에 공백이 있는 파일이나 피드에 추가되거나 제거된 파일을 처리하지 않는 빠르고 더러운 스크립트이지만 이것이 시작점입니다.

답변2

스크립트를 여러 번 실행하는 동안 지속되도록 하려면 파일을 디스크나 다른 비휘발성 매체에 끌어서 놓아야 합니다. 스크립트는 시작 시 초기화를 위해 파일을 읽고 종료 시 씁니다. 나중에 참조:

#!/bin/bash
dropfile='/path/to/your/counterfile'
if [[ -r "$dropfile" ]]; then
    counter=$(cat "$dropfile" )
else
    counter=0
fi
trap 'echo $counter > "$dropfile"' EXIT

echo "This script has run $counter times."
counter=$((counter+1))

답변3

버전 관리 시스템을 구축하겠습니다. 예를 들어, hg init파일이 저장된 디렉터리에서 mercurial을 사용합니다. 그런 다음 하루에 한 번( cron새 파일이 배치된 후 작업으로) , hg addremove.hg commit

그런 다음 보고서를 실행하려면 각 파일( for filename in dropzone/*; do)을 반복하여 마지막 커밋 타임스탬프(예: )를 얻을 수 있습니다 hg log -l 1 --template "{date(date, '%s')}\n" "$filename". UNIX 초 타임스탬프를 제공 합니다 %s. 을 사용하여 현재 값을 구하고 $(date +%s)이를 뺀 다음 대략적으로 일 수로 변환할 수 있습니다.

모든 VCS( svn, git등)가 적합하므로 원하는 것을 사용하세요.

관련 정보