몇 초를 매개변수로 하여 일정 시간 동안(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
쉘 옵션을 설정하는 쉘의 명령입니다. 이 셸 옵션을 사용하면 파일 이름 와일드카드 패턴이 일치하게 됩니다(예: 숨겨진 이름 및 점으로 시작하지 않는 이름).dotglob
bash
*
삭제도 감지하위 디렉토리약간 까다롭게 들리지만 그렇지 않습니다.
#!/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을 이용해 보세요 :)