비슷한 플래그를 사용하여 여러 명령을 실행하고 싶다고 가정해 보겠습니다. 예를 들면 다음과 같습니다.
du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4
--exclude
일련의 플래그를 재사용 하고 이러한 플래그를 변수에 저장하는 것처럼 코드를 더 깔끔하게 만들고 싶습니다 .
그 후 위의 명령은 다음과 같습니다
du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"
해당 tar
디렉터리와 관련된 파일 및 디렉터리는 제외됩니다.
가장 좋고 깨끗한 솔루션은 무엇입니까?
배경
tar를 사용하여 시스템을 백업하고 필요하지 않은 일부 디렉토리를 제외하고 싶습니다.
답변1
다음을 시도해 볼 수 있습니다.
$ echo -e / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
/ --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
$ echo !!:3-$
echo --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
--exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
bash
여기서는 히스토리 확장을 사용합니다 .
!!
마지막 명령을 참조하세요3-$
세 번째 매개변수부터 마지막 매개변수까지 참조하세요.
bash
비대화형 쉘에서는 비활성화된 기록 확장 기능을 스크립트에서 활성화해야 합니다.
set -o history
set -o histexpand
답변2
Bash에서 매우 깔끔한 방법은 배열을 사용하는 것입니다.
myflags=( --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4 )
tar cvf archive / "${myflags[@]}"
공백 및 기타 흥미로운 문자를 처리할 수 있습니다.
myflags=( "--exclude=/a dir/with spaces" $'--exclude=/a dir/with\nnewlines' )
tar cvf archive / "${myflags[@]}"
/this/one
예를 들어 디렉터리에 문자가 포함된 모든 하위 디렉터리를 제외하려는 경우에는 위조할 수도 있습니다 g
.
exclude_dirs=( /this/one/*g* )
myflags=( "${exclude_dirs[@]/#/--exclude=}" )
tar cvf archive / "${myflags[@]}"
답변3
이것을 댓글로 추가하고 싶었지만 아직 댓글 형식을 멋지게 지정하는 방법을 찾지 못했습니다.
어쨌든 나는 당신이 90% 성공했다고 믿습니다. 노력하다:-
EFLAGS="--exclude=/dir1 --exclude=/dir2"
du -sh / $EFLAGS
tar cvf archive / $EFLAGS
첫 번째 줄에는 공백이 포함되어 있으므로 따옴표가 필요합니다.
공백으로 인수를 분할하려면 따옴표 없이 변수를 사용하세요.
제외된 디렉터리 이름에 공백이 있으면 이스케이프해야 합니다.