초 단위로 삭제된 파일을 확인하는 스크립트(인수로 제공)

초 단위로 삭제된 파일을 확인하는 스크립트(인수로 제공)

몇 초를 매개변수로 하여 일정 시간 동안(sleep) 세션을 유지한 후 홈 디렉터리에서 삭제된 파일 목록을 표시하는 스크립트를 작성합니다. 수면 전후의 현재 시간과 날짜를 표시하려면 "날짜"를 사용하세요.

 #!/bin/bash

time_b=$(date)

(sleep 30

ls -all $HOME | grep -v "(cat tmp_file.txt )" | while read s

do 

    echo deleted file: $s

done

echo Time before: $time_b

echo Time after: $(date)

)

답변1

#!/bin/sh

snooze=$1

set -- "$HOME"/*

date +'Start: %F %T'
sleep "$snooze"
date +'End:   %F %T'

for pathname do
    if [ ! -e "$pathname" ]; then
        printf 'Deleted from home: %s\n' "${pathname##*/}"
    fi
done

스크립트는 첫 번째 명령줄 인수를 가져와 $1변수에 할당합니다 snooze. 그런 다음 홈 디렉터리에 있는 모든 파일과 디렉터리의 이름(숨겨진 이름 제외)을 가져와 위치 매개변수( 등)에 할당 $1합니다 $2.

사용자가 지정한 취침시간 이전에는 현재 날짜와 시간을 출력합니다. 잠에서 깨어난 후 날짜와 시간을 다시 인쇄합니다.

루프 for는 홈 디렉토리에 있는 원래 이름을 반복하여 해당 이름이 여전히 존재하는지 테스트합니다. 이름을 더 이상 찾을 수 없으면 인쇄됩니다(그리고 경로 이름에서 디렉토리 경로가 제거됩니다).

그게 다야.

삭제만 감지하려는 경우일반 파일(또는 일반 파일에 대한 심볼릭 링크) 홈 디렉토리의 내용에 대해 얻은 경로 이름 목록에 다음 파일의 경로 이름만 포함되어 있는지 확인해야 합니다.

#!/bin/sh

snooze=$1

set --
for pathname in "$HOME"/*; do
    if [ -f "$pathname" ]; then
        set -- "$@" "$pathname"
    fi
done

date +'Start: %F %T'
sleep "$snooze"
date +'End:   %F %T'

for pathname do
    if [ ! -e "$pathname" ]; then
        printf 'Deleted from home: %s\n' "${pathname##*/}"
    fi
done

여기서는 단순히 절약만 하는 것이 아닙니다모두홈 디렉토리에서 볼 수 있는 이름을 통해 이를 반복하고 -f올바른 것으로 테스트된 이름(일반 파일 및 일반 파일에 대한 심볼릭 링크)만 저장합니다. 디렉터리는 건너뜁니다. 나머지 스크립트는 이전과 동일합니다.

삭제 감지숨겨진파일을 제출하는 가장 쉬운 방법은 다음으로 전환하는 것입니다 bash(위 스크립트는 를 사용하여 실행됩니다 /bin/sh).

#!/bin/bash

shopt -s dotglob

snooze=$1

set --
for pathname in "$HOME"/*; do
    if [ -f "$pathname" ]; then
        set -- "$@" "$pathname"
    fi
done

date +'Start: %F %T'
sleep "$snooze"
date +'End:   %F %T'

for pathname do
    if [ ! -e "$pathname" ]; then
        printf 'Deleted from home: %s\n' "${pathname##*/}"
    fi
done

유일한 차이점은 #!명령이 이제 /bin/bash인터프리터에 의해 실행되어야 함을 나타내는 - 라인과 shopt -s dotglob쉘 옵션을 설정하는 쉘의 명령입니다. 이 셸 옵션을 사용하면 파일 이름 와일드카드 패턴이 일치하게 됩니다(예: 숨겨진 이름 및 점으로 시작하지 않는 이름).dotglobbash*

삭제도 감지하위 디렉토리약간 까다롭게 들리지만 그렇지 않습니다.

#!/bin/bash

shopt -s dotglob globstar

snooze=$1

set --
for pathname in "$HOME"/**; do
    if [ -f "$pathname" ]; then
        set -- "$@" "$pathname"
    fi
done

date +'Start: %F %T'
sleep "$snooze"
date +'End:   %F %T'

for pathname do
    if [ ! -e "$pathname" ]; then
        printf 'Deleted from home: %s\n' "${pathname#$HOME/}"
    fi
done

여기서 유일한 차이점은 이 globstar옵션도 활성화되어 있다는 것입니다. 이 셸 옵션을 사용하면 처럼 일치 하지만 경로 이름을 확장할 수도 **있는 glob 패턴 에 액세스할 수 있습니다 . 그러면 패턴이 일치할 것입니다.*/$HOME/**모든 것홈 디렉토리에 있습니다.

또한 파일 이름보다 더 많은 것을 포함하도록 제거된 경로 이름의 인쇄를 약간 수정했습니다(하위 디렉토리에 있을 수 있으므로 보기에 좋을 것입니다).무엇하위 디렉터리).

답변2

#!/usr/bin/env bash

sleep_time=$1
time_a=$(date)

mapfile -t files_a < <(find "$HOME" -type f -maxdepth 1)

sleep "$sleep_time"

mapfile -t files_b < <(find "$HOME" -type f -maxdepth 1)

comm -23 <(printf '%s\n' "${files_a[@]}" | sort) <(printf '%s\n' "${files_b[@]}" | sort)

printf '%s\n' "We started at: $time_a" "We ended at: $(date)"
  • sleep_time=$1
    • 수면 시간에 대한 매개변수를 제공하라는 요청을 받았습니다. 귀하의 주장은 다음과 같이 표현됩니다.위치 매개변수귀하의 스크립트에서. 즉, 호출하면 ./script.sh 30첫 번째 위치 인수는 와 같습니다 30.
  • time_a=$(date)
    • 원래 코드에서 이미 알아냈지만 이는 시작 시간을 표시하는 데 사용되는 날짜입니다.
  • mapfile -t files_a < <(find "$HOME" -type f -maxdepth 1)
    • 여기서 상황이 더욱 복잡해집니다. 이전과 이후의 파일 목록을 비교할 수 있도록 파일 목록을 작성해야 합니다. 여기서는 맵 파일을 사용하여 해당 파일의 배열을 만듭니다. 이제 배열을 직접 만들 수 있지만 파일에 공백이나 개행 문자가 포함되어 있으면 문제가 발생합니다. mapfile이 더 잘 작동할 것입니다.
    • find "$HOME" -type f -maxdepth 1$HOME- 디렉터리에 있는 모든 파일 형식의 파일 목록이 인쇄됩니다 (하위 디렉터리로 재귀되지 않음).
  • sleep "$sleep_time"
    • 이곳은 우리가 정해진 시간에 자는 곳이다
  • mapfile -t files_b < <(find "$HOME" -type f -maxdepth 1)
    • 비교를 위해 절전 모드 후에 두 번째 파일 배열을 생성하고 있습니다.
  • comm -23 <(printf '%s\n' "${files_a[@]}" | sort) <(printf '%s\n' "${files_b[@]}" | sort)
    • comm유틸리티는 두 개의 파일을 읽고 3개의 열((1) 행)을 인쇄합니다.오직파일 1의 라인 (2)오직file2에서는 두 파일의 (3) 줄입니다. file1의 고유한 행에만 관심이 있으므로 매개변수를 사용하여 -23열 2와 3을 억제합니다. 다음으로, 우리가 사용하는 파일 대신 배열에 파일을 저장하기 때문에프로세스 교체배열을 comm파일에 전달합니다.
  • printf '%s\n' "We started at: $time_a" "We ended at: $(date)"
    • 시작 및 종료 시간을 인쇄합니다.

답변3

이것은 나에게 대학 과제처럼 느껴졌습니다. 귀하의 스크립트가 이해가 되지 않으므로 귀하가 말씀하신 대로 시도해 보겠습니다.

  • 몇 초를 매개 변수로 사용하고 잠시 동안 세션을 유지하는 스크립트를 작성합니다(수면).

귀하의 bash 스크립트는 다음과 같은 매개변수를 사용하여 실행되어야 한다고 가정합니다../script 30 https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Parameters

  • 그러면 홈 디렉터리에서 삭제된 파일 목록이 표시됩니다.
for file in $HOME/*; do
    # if it is a file
      #save the value of $file on a log file placed not in your $HOME directory
      #delete the file
done

http://mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

  • 수면 전후의 현재 시간과 날짜를 표시하려면 "날짜"를 사용하세요. 이것은 자명하다.
dateBefore="$(date)"
#sleep command here
dateAfter="$(date)"
echo "Date before sleep : $dateBefore"
echo "Date before after sleep : $dateBefore"

나는 당신이 이 문제를 해결하도록 돕기 위해 최선을 다했으므로 이제 당신이 스스로 이 스크립트를 완료할 수 있다고 가정할 수 있습니다. 그래도 할 수 없다면 매뉴얼 페이지와 Google을 이용해 보세요 :)

관련 정보