그래서 매시간 실행되는 간단한 백업 스크립트를 만들고 있습니다. 이 스크립트가 하는 일은 백업 디렉터리를 만들고 파일을 복사하는 것뿐입니다.
./backup/'$HOME'/Documents/todo.txt
백업 구조
- backup
- '$HOME'
- Documents
- todo.txt
- Pictures
- etc
- ....
사용자에게 연결되지 않도록 폴더 이름에 홈 변수를 유지합니다.
이제 백업 폴더의 모든 파일을 복사하는 복구 스크립트를 만들려고 하는데 문제는 구조를 에코할 때 해당 $HOME
부분이 구문 분석되지 않고 직접 에코된다는 것입니다.
그 에코는 다음과 같습니다
/$HOME/Documents/todo.txt
나는 그것이 다음과 같이 에코되기를 원합니다.
/home/myuser/Documents/todo.txt
백업 파일의 각 파일을 반복하고 파일을 다음 위치에 복사하는 데 사용하는 코드는 다음과 같습니다.
for file in $(find backup -type f); do
echo "$file" | cut -c 7- | xargs -I {} cp $file {}
done
그러나 물론 $HOME
내 폴더 내의 폴더가 backup
변수로 확인되지 않기 때문에 이것은 작동하지 않습니다. 그렇다면 문자열의 변수를 구문 분석하여 변수처럼 작동하도록 만드는 것이 가능합니까?
답변1
몇 가지 팁:
- 변수를 설명하는데 사용됩니다
eval
. find
결과를 반복하는 대신find -exec
.bash
대신 하위 문자열 제거를 사용하십시오cut
.rsync
대신 사용하십시오cp
.- 복사하기 전에 디렉토리를 생성하십시오.
find backup -type f -exec sh -c '
mkdir -p "$(eval dirname "${1#*/}")";
rsync -av "$1" "$(eval printf "${1#*/}")"
' find-sh {} \;
rsync
아니면 원하는 것을 정확히 수행하는 먼저 사용하는 것이 더 좋습니다.
rsync -av backup/\$HOME/ $HOME/