
다음과 같은 유사한 플래그를 사용하여 여러 명령을 실행하고 싶다고 가정해 보겠습니다.
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-$
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
공백이 포함되어 있으므로 첫 번째 줄에 따옴표가 필요합니다.
인수를 공백으로 분할하기 위해 변수를 사용할 때 따옴표가 없습니다.
제외된 디렉터리 이름에 공백이 있으면 이스케이프해야 합니다.