도트 파일을 복사하려면 간단한 쉘 스크립트가 필요합니다..지원확장, 즉.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를 통해 현재 찾은 파일 이름으로 확장됨
어쩌면 이것은 또 다른 옵션일 수도 있습니다. 너무 신비롭지 않기를 바랍니다. 다양한 상황에서 도움을 구합니다 ;-)