Freebsd: 쉘 스크립트를 사용하여 포인트 파일 백업

Freebsd: 쉘 스크립트를 사용하여 포인트 파일 백업

도트 파일을 복사하려면 간단한 쉘 스크립트가 필요합니다..지원확장, 즉.dotfile1.백업. 기존 백업에 확장을 추가하는 데 시간이 오래 걸리므로 아래 스크립트는 작동하지 않습니다..dotfile1.backup.backup.

bkdot.sh

#!/bin/sh
for file in .*; do
    cp “./$file” “./$file.backup”
done

다음 스크립트는 트릭을 수행해야 하는 것처럼 보이지만 아무 일도 일어나지 않습니다. 무엇이 빠졌나요?

bkdot_revised.sh

#!/bin/sh
for file in .*; do
     if [ ! “./$file.backup” ]; then
         cp “./$file” “./$file.backup”
     fi
done

답변1

테스트에 [충분한 정보가 없습니다. $file참고자료와 비교 하셔야 합니다 . 현재 구성에서는 "x가 이 문자열이 아닌 경우"라고 되어 있지만 "x가 이 문자열이 아닌 경우"라고 말해야 합니다. [[대신 에 정규 표현식을 사용하겠습니다 [.

#!/bin/bash
GLOBIGNORE=.:..
for file in .*; do
     if [[ ! "$file" =~ \.backup$ ]]; then
         cp "$file" "$file.backup"
     fi
done
  • Kusalananda의 의견을 바탕으로 빌드가 제대로 작동하는지 /bin/bash확인하기 위해 shebang을 옮겼습니다 .[[
  • Gordon Davidson의 의견을 토대로 GLOBIGNORE스크립트가 복사하려고 하지 않도록 .추가 하고..

기타 사항:

  • ./경로에는 불필요합니다. 당신은 이미 이 디렉토리에 있습니다!
  • 이것이 단지 복사-붙여넣기 문제인지는 확실하지 않지만 대신에 문제가 있습니다 ".
  • 개인적으로 나는 다른 디렉토리에 복사하여 이러한 모든 문제를 피하고 홈 디렉토리를 오염시키는 것을 방지할 것입니다. 사실 저는 모든 것을 (증분적으로) 백업합니다!

이것은 순수 /bin/sh버전입니다. [[bashism을 사용하는 대신사례대신에.

#!/bin/sh
GLOBIGNORE=.:..
for file in .*; do
  case "$file" in
    *.backup) ;;
    *) cp "$file" "$file.backup";;
  esac
done

답변2

연산자는 !단순히 피연산자를 부정하므로 조건은 항상 로 평가됩니다 false. -f예를 들어, 파일이 존재하면 true를 반환 하는 일부 파일 테스트 연산자가 있습니다 .

그러나 제대로 수행하고 있는지 잘 모르겠습니다. 존재하지 않는 경우 백업을 수행하는 것뿐만 아니라 기존 백업을 항상 덮어쓰는 것도 안전하지 않습니다.

이것은 가능합니다.

#!/bin/sh
for file in .*; do
     if [ ! -f "./${file}.backup" ]; then
         cp "./${file}" "./${file}.backup"
     fi
done

답변3

sed단순히 백업용으로 사용하면 어떨까요 ?

sed -i.bak 's#\n#\n#' <filepattern*>

답변4

예상되는 동작이 다음과 같은 경우:

  • 기존 점 파일의 복사본 만들기
  • 하지만 존재하지 않는 경우에만

그런 다음 find를 사용할 수 있습니다.

gunhed@gstation:[~/test]0$ ls -la
insgesamt 2
drwxrwxr-x   2 gunhed gunhed 0 Dez 30 20:45 .
drwxr-x--- 100 gunhed gunhed 0 Dez 30 20:44 ..
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test2
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test3
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test4
gunhed@gstation:[~/test]0$ find . -maxdepth 1 -type f -regex "^.*[^.bak]$" -exec cp -vn {} {}.bak \;
'./.test4' -> './.test4.bak'
'./.test3' -> './.test3.bak'
'./.test' -> './.test.bak'
'./.test2' -> './.test2.bak'
gunhed@gstation:[~/test]0$ find . -maxdepth 1 -type f -regex "^.*[^.bak]$" -exec cp -vn {} {}.bak \;
gunhed@gstation:[~/test]0$ ls -la
insgesamt 4
drwxrwxr-x   2 gunhed gunhed 0 Dez 30 20:45 .
drwxr-x--- 100 gunhed gunhed 0 Dez 30 20:44 ..
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test2
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:45 .test2.bak
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test3
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:45 .test3.bak
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:39 .test4
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:45 .test4.bak
-rw-rw-r--   1 gunhed gunhed 0 Dez 30 20:45 .test.bak
gunhed@gstation:[~/test]0$ 

다음을 사용하여 옵션을 찾으세요.

  • .: 현재 디렉터리를 시작점으로 사용
  • -maxlength: 여기에서 하위 디렉터리로 이동하지 마세요.
  • -type f: 일반 파일만 찾기
  • -regex "^.*[^.bak]$": "."로 시작하지만 .bak로 끝나지 않는 모든 파일 이름(이 예에서는 백업 확장자)
  • -exec cp -vn: cp 표준 복사 명령, -n은 재정의되지 않음, -v는 상세함
  • {} {}.bak: find를 통해 현재 찾은 파일 이름으로 확장됨

어쩌면 이것은 또 다른 옵션일 수도 있습니다. 너무 신비롭지 않기를 바랍니다. 다양한 상황에서 도움을 구합니다 ;-)

관련 정보