tar --exclude 값으로 배열

tar --exclude 값으로 배열

일부 백업 스크립트를 작성하고 싶지만 일부 디렉터리를 제외해야 합니다. 그래서 저는 제외된 모든 디렉토리를 이와 같은 배열로 설정하기로 결정했습니다.

exclude[0] = '/home/user/test1'
exclude[1] = '/home/user/test2'
exclude[2] = '/home/user/test3'

이 배열을 tar 명령의 인수로 제공할 수 있습니까?

tar -zcvf $FILE $SOURCE --exclude=exclude

답변1

그리고 zsh:

exclude=(
  /home/user/test1
  /home/user/test2
  /home/user/test3
)
tar  --exclude=$^exclude -zcvf $FILE $SOURCE

$^exclude구문을 사용하면 위의 내용을 다음으로 확장할 수 있습니다.

tar  --exclude=/home/user/test1 --exclude=/home/user/test2 \
     --exclude=/home/user/test3 -zcvf the-file the-source

rc기본적으로 , 및 es쉘은 fish배열을 사용하여 이 작업을 수행하므로 이러한 쉘에서는 다음을 수행할 수 있습니다.

tar  --exclude=$exclude -zcvf $FILE $SOURCE

set exclude /home/user/test1 /home/user/test2 /home/user/test3( 배열을 정의하는 데 사용됨 fish)

답변2

명령의 각 매개변수는 문자열입니다. 이 옵션에는 배열을 전달할 수 없습니다 --exclude. 여러 옵션을 전달 --exclude하거나 다음과 같은 다른 방법을 사용해야 합니다.--exclude-from.일부 쉘에는 배열에 삽입하고 각 요소 앞에 다음을 붙이는 영리한 방법이 있습니다., 그러나 대부분의 경우(sh, bash, ksh, ...)는 이를 수행하지 않습니다.

모든 셸에서 작동하는 한 가지 방법은 명령줄을 단계별로 작성하는 것입니다.

set -- tar -zcvf "$FILE" 
set -- "$@" --exclude='/home/user/test1'
set -- "$@" --exclude='/home/user/test2'
set -- "$@" --exclude='/home/user/test3'
"$@" "$SOURCE"

bash 또는 ksh를 사용 중이고 제외할 패턴 세트가 있는 경우 배열을 반복하여 명령줄을 작성할 수 있습니다.

exclude=('/home/user/test1' '/home/user/test2' '/home/user/test3')
exclude_options=()
for x in "${exclude[@]}"; do
  exclude_options+=(--exclude="$x")
done
tar -zcvf "$FILE" "${exclude_options[@]}" "$SOURCE"

이전 버전의 ksh 및 bash에는 연산자가 부족하여 루프 본문으로 +=필요했습니다 .exclude_options=("${exclude_options[@]}" --exclude="$x")

제외 옵션에 대해 별도의 배열을 작성하는 대신 명명된 배열 변수 또는 위치 인수 배열에서 직접 명령줄을 작성할 수 있습니다.

exclude=('/home/user/test1' '/home/user/test2' '/home/user/test3')
set -- tar -zcvf "$FILE"
for x in "${exclude[@]}"; do
  set -- "$@" --exclude="$x"
done
 "$@" "$SOURCE"

답변3

대안으로 --exclude-from스위치를 사용하여 여러 위치를 처리 할 수 있습니다.

tar --exclude-from=/home/user/exclude.txt -zcvf "$FILE" "$SOURCE"

이제 한 줄에 하나의 정규식을 포함하는 파일을 만듭니다.

cat /home/user/exclude.txt

/home/user/test1
/home/user/test2
/home/user/test3

답변4

sudo rsync -avz -e "ssh -i your-pem-key.pem" --exclude-from=folder-name-files/exclude.txt folder-name-files/ [email protected]:folder-files/

파일에서 exclude.txt다음과 같이 무시된 모든 파일을 언급해야 합니다.

/assets
.gitignore
exclude.txt

관련 정보