변수 구문과 기타 명령을 검색했지만 지나칠 수 없습니다.
btrfs 스냅샷을 사용하여 생성된 폴더가 있습니다. 각 폴더에는 이름이 지정된 파일이 /etc/fstab
있으며 해당 파일을 편집하고 항상 폴더 경로의 값으로 바꿔야 합니다. 예를 @
들어 나는@snapshots/daily/root2020-12-27_19H05
여기의 변수에는 2020-12-27_19H05
항상 접두사가 붙습니다 root
.
파일 편집을 시작하기 전에 첫 번째 단계는 변수로 찾은 모든 폴더에 루트로 파일을 생성하는 간단한 bash 스크립트를 만드는 것과 같은 간단한 작업을 수행하는 것입니다.
cd /.snapshots/daily
SNAPSHOTS=$(ls -d root*/)
echo > $SNAPSHOTS/test
하지만 다음과 같은 오류가 발생합니다.
bash: $SNAPSHOTS/test: ambiguous redirect
제가 생각할 수 있는 모든 위치에서 "", '', (), {}를 사용하여 모든 것을 시도했지만 모두 실패했습니다. 몇몇 곳에서 SUDO를 사용해 보았지만 역시 실패했습니다. 이것은 인터넷에서 흔한 일인 것 같지만 내가 읽은 내용 중 어느 것도 내 문제를 이해하고 해결하지 못했습니다.
내가 뭘 잘못했나요?
감사해요!
답변1
SNAPSHOTS
여러 디렉터리를 포함 할 수 있습니다 .
set -x
명령 앞에 줄을 삽입하면 문제를 볼 수 있습니다 echo
. 이 표시됩니다 $SNAPSHOTS
.
루프를 사용하여 echo
일치하는 각 디렉터리에 대해 명령을 호출합니다.
for i in root*/
do
if [ "$i" != 'root*/' ]
then
touch "$i"/test
fi
done
일치하는 디렉터리가 없으면 추가 기능이 if
실행되지 않습니다.touch 'root*/test'
답변2
변수에 SNAPSHOTS
공백이 포함되어 있습니다. 해당 값으로 리디렉션하려면 큰따옴표를 사용하세요.
echo > "$SNAPSHOTS"/test
SNAPSHOTS
단일 문자열에 여러 개의 개별 문자열을 저장할 수 없으며 해당 단일 문자열에서 올바르게 검색할 수 있다고 생각하기 때문에 이는 원하는 대로 수행되지 않을 가능성이 높습니다 . 실제로는 배열이어야 하며ls
여기서는 전혀 필요하지 않습니다:
shopt -s nullglob
SNAPSHOTS=(root*/)
for snap in "${SNAPSHOTS[@]}"; do
echo >"$snap"/test
done
그렇지 않으면
shopt -s nullglob
for snap in root*/; do
echo >"$snap"/test
done
쉘 옵션을 설정하면 nullglob
일치하는 패턴이 없는 경우 패턴이 완전히 제거됩니다. 그렇지 않은 경우 nullglob
일치하는 항목이 없으면 패턴은 그대로 유지됩니다.
빈 줄을 넣을 파일이 많지 않다면 이렇게 할 수도 있습니다.
shopt -s nullglob
SNAPSHOTS=(root*/)
echo | tee "${SNAPSHOTS[@]/%//test}" >/dev/null
네가 정말로 원한다면만들다파일을 작성하고(빈 줄을 쓰지 마십시오) 다음을 사용하십시오 touch
.
shopt -s nullglob
SNAPSHOTS=(root*/)
touch "${SNAPSHOTS[@]/%//test}" 2>/dev/null
답변3
여러분은 모든 것을 알고 있으며 우리가 이해할 수 있도록 답변을 설명합니다. 이 웹사이트는 놀라운 데이터베이스입니다.
드디어 내가 갔어
for i in root*/
do
if [ "$i" != 'root*/' ]
then
sudo touch "$i"/test
fi
done
이러한 스냅샷 폴더는 루트가 소유하므로 여기서는 sudo가 사용됩니다.
이제 변수 내에 반환된 폴더 목록의 파일에 대한 생성, 이름 바꾸기, 삭제, 권한 변경 등의 첫 번째 단계를 이해했습니다.
이제 한 단계 더 나아가 변수가 반환한 각 폴더의 파일을 편집하고 고정 값을 변수가 처음에 반환한 값과 동일한 변수 값으로 대체했습니다.
대체하려는 값에 변수를 통합하는 방법을 이해할 수 없습니다.
스크립팅을 더 쉽게 만들기 위해 스냅샷 구조를 변경했습니다. 이제 폴더 내의 모든 폴더를 나열하는 변수는 다음을 반환합니다.
echo $SNAPSHOTS
2020-12-22_19H05/
2020-12-23_19H05/
2020-12-24_19H05/
2020-12-25_19H05/
2020-12-26_19H05/
2020-12-27_19H05/
2020-12-28_19H05/
2020-12-22_19H05/etc/fstab
매일 디렉터리 이름이 바뀌는(가장 오래된 것이 하루 삭제되고 오늘 추가됨) 각 폴더에는 /etc/fstab에 예 를 들어 파일이 있습니다 .
파일을 편집하고 고정 값 "@home"을 검색한 후 고정 접두사 문자열의 변수 값 부분으로 바꿔야 합니다. 예를 들면 다음과 같습니다.
@snapshots/daily/home/$VARIABLE
$VARIABLE = 위에 나열된 첫 번째 변수에서 반환된 디렉터리 이름입니다.
따라서 폴더 내에서 2020-12-22_19H05/
파일은 생략/잘라야 하는 파일이 끝에 없는 파일을 /etc/fstab
대체하도록 편집됩니다 . 첫 번째 변수에서 찾은 모든 폴더에 대해서도 마찬가지입니다.@home
@snapshots/daily/home/2020-12-22_19H05
/
나는 sed와 아마도 %가 사용될 것으로 기대하고 있지만 1-답을 얻기 위해 인터넷에서 무엇을 검색해야 할지 잘 모르겠지만 대부분 2-답을 이해합니다.
감사해요!