스크립트 사용 방법을 배우려고 노력 중입니다 bash
. Google에서 답변을 찾았지만 내 문제에 대한 답변을 찾을 수 없습니다.
스크립트는 다음과 같습니다.
#!/bin/bash
TIME=`date +%b-%d-%y`
FILENAME=backup-$TIME.tar.gz
DESDIR=home/pi/backups
SRC=home/pi/backuplist.txt
find -iname '*.orig' -o -iname '*.py' > home/pi/backuplist.txt
tar -zcvf $DESDIR/$FILENAME $SRC
실행하면 생성되지 않으므로 backuplist.txt
작업할 결과가 없습니다 tar
.
파이프에서 find -iname
직접 with를 사용해 보았지만 방금 응답을 받았습니다 .tar
-iname command does not exist
터미널에서 먼저 출력을 사용한 find
다음 사용 하면 tar
작동합니다 .
내가 뭘 잘못했나요?
답변1
이 스크립트에는 두 가지 주요 문제가 있습니다.
경로는 상대적입니다. 즉, 실행할 때 다음
home/pi
이 있다고 가정합니다.현재 디렉터리.home/pi
스크립트의 모든 인스턴스 를/home/pi
.이 명령은 파일 내의 파일을
tar
백업하기 위한 것일 수 있습니다 .backuplist.txt
지금 작성된 방식으로는tar
파일 자체만 포함하고 다른 것은 포함하지 않는 아카이브를 얻게 됩니다.backuplist.txt
읽고 싶다면콘텐츠이 파일의 경우tar -zcvf "$DESDIR/$FILENAME" -T "$SRC"
.스크립트에는 따옴표가 없는 변수도 있습니다.
내 생각엔 당신이 원하는 게 이것이다.
#!/bin/bash
TIME="$(date +%b-%d-%y)"
FILENAME="backup-$TIME.tar.gz"
DESDIR="/home/pi/backups"
SRC="/home/pi/backuplist.txt"
find /home/pi -iname '*.orig' -o -iname '*.py' >"$SRC"
tar -zcvf "$DESDIR/$FILENAME" -T "$SRC"
/home/pi
명령줄에 있는 내용은 find
대략적인 추측입니다. 그것이 없으면 GNU가 find
현재 디렉토리를 사용할 것이라고 가정합니다.
답변2
나는 이 약간 다른 스크립트가 파일 목록을 tar
.
변수가 사용되는 위치를 인용하고 백틱을 `...`
현대적인 구문으로 대체했습니다.$(...)
/
마지막으로, 사용하는 경로가 존재할 수 있도록 실행하기를 원한다고 가정합니다 .
#!/bin/bash
WHEN=$(date +%b-%d-%y)
FILENAME="backup-$WHEN.tar.gz"
DESDIR=/home/pi/backups
SRC=/home/pi/backuplist.txt
mkdir -p "$DESDIR"
cd /
find -iname '*.orig' -o -iname '*.py' |
tee "$SRC" |
tar zcvf "$DESDIR/$FILENAME" --no-recursion --verbatim-files-from --files-from -
$SRC
백업 프로세스 중에 파일 목록을 생성할 필요가 없으면 이 두 참조 줄을 완전히 생략할 수 있습니다.