디렉터리의 일부가 길고 알 수 없는 문자열인 bash 스크립트를 작성하려고 합니다. 나는 디렉토리 이름의 첫 부분을 알고 있습니다. 알려진 문자열과 와일드카드를 경로에 결합하는 방법은 무엇입니까? 현재 나는 다음을 가지고 있습니다:
ID=$1;
IMP="[email protected]:/data/"$ID"/EER_DATA/$ID"*"/ImpostorScores.txt"
그러나 이것은 문자 그대로의 의미를 전달합니다 *
.
답변1
여러 가지 옵션이 있습니다.
- NFS, FUSE-over-SSH 또는 기타 방법을 사용하여 원격 파일 시스템을 로컬로 노출한 다음 내보낸 파일 시스템 경로에
bash
기본 glob을 적용합니다 .FOO=/*/passwd
(ZSH에는${~spec}
전역 대체 매개변수 확장이 있습니다. 그렇지 않으면 쉘 매뉴얼을 참조하세요.) - SSH를 통해 원격 시스템에 연결하고 거기서 glob을 실행합니다.
ssh host 'echo /*/passwd'
- 이스케이프된(또는 백슬래시나 작은따옴표로 제거된) 전역 변수를 원격 시스템에 전달합니다.
scp host:/\*/passwd .
이러한 옵션 중 일부는 glob 완료와 해당 파일 이름과 관련된 후속 단계(변경되었을 수 있음) 사이에 파일 이름이 변경되는 경우 경쟁 조건이 발생하기 쉽습니다.
답변2
SSH 대신 tar를 사용할 수 있습니다.
tar cf - filename | ssh [email protected] "cd /data/$ID/EER_DATA/$ID*; tar xf -"
비밀번호를 묻는 메시지가 표시되지 않도록 ssh-agent가 설정되어 있는지 확인하세요. scp나 심지어 일반 cp에서도 와일드카드 디렉토리를 사용할 수 없을 것 같습니다.
나는 이것을 bash와 zsh에서 테스트했습니다.
답변3
"변수 할당"의 오른쪽은 인용된 것으로 처리됩니다(분할이나 와일드카드 없음).
LESS=+'/A variable may be assigned' man bash
변수는 다음 형식의 명령문으로 할당될 수 있습니다:
name=[value]는
단어 분할을 수행하지 않습니다. .... 경로 이름 확장은 수행되지 않습니다.
그래서:
$ var=*
$ echo "$var"
*
별표를 확장하려면 따옴표 없이 별표를 사용해야 합니다.
var="$(echo *)" ### Expand to the list of files on pwd.
귀하의 경우:
$ ID=one
$ IMP="$( echo "[email protected]:/data/$ID/EER_DATA/"*"/ImpostorScores.txt")"
$ echo "$IMP"
[email protected]:/data/one/EER_DATA/something/ImpostorScores.txt
전체 경로가 일치하면 무언가가 확장됩니다. 즉, 다음과 같은 트리가 존재합니다.
$ tree [email protected]\:/
[email protected]:/
└── data
└── one
└── EER_DATA
└── something
└── ImpostorScores.txt
참고: 소스에서 두 번째 항목을 제거했는데 $ID
쉽게 교체할 수 있습니다.