디렉터리의 일부가 길고 알 수 없는 문자열인 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'
- 이스케이프된(또는 백슬래시나 작은따옴표를 통해 변형된) glob을 원격 시스템에 전달합니다.
scp host:/\*/passwd .
이러한 옵션 중 일부는 glob이 완료된 시점과 해당 파일 이름과 관련된 후속 단계 사이에 파일 이름이 변경될 경우 경쟁 조건이 발생하기 쉽습니다.
답변2
SSH를 통해 tar를 사용할 수 있습니다.
tar cf - filename | ssh [email protected] "cd /data/$ID/EER_DATA/$ID*; tar xf -"
비밀번호를 묻는 메시지가 표시되지 않도록 ssh-agent를 설정했는지 확인하세요. 일반 cp를 사용하지 않고도 scp와 함께 와일드카드 디렉토리를 사용할 수 없다고 생각합니다.
나는 이것을 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
쉽게 교체할 수 있습니다.