이름에 $HOME이 포함된 폴더 구조 확인

이름에 $HOME이 포함된 폴더 구조 확인

그래서 매시간 실행되는 간단한 백업 스크립트를 만들고 있습니다. 이 스크립트가 하는 일은 백업 디렉터리를 만들고 파일을 복사하는 것뿐입니다.

./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/

관련 정보