디렉터리 경로에 와일드카드 문자 사용

디렉터리 경로에 와일드카드 문자 사용

디렉터리의 일부가 길고 알 수 없는 문자열인 bash 스크립트를 작성하려고 합니다. 나는 디렉토리 이름의 첫 부분을 알고 있습니다. 알려진 문자열과 와일드카드를 경로에 결합하는 방법은 무엇입니까? 현재 나는 다음을 가지고 있습니다:

ID=$1;

IMP="[email protected]:/data/"$ID"/EER_DATA/$ID"*"/ImpostorScores.txt"

그러나 이것은 문자 그대로의 의미를 전달합니다 *.

답변1

여러 가지 옵션이 있습니다.

  1. NFS, FUSE-over-SSH 또는 기타 방법을 사용하여 원격 파일 시스템을 로컬로 노출한 다음 내보낸 파일 시스템 경로에 bash기본 glob을 적용합니다 . FOO=/*/passwd(ZSH에는 ${~spec}전역 대체 매개변수 확장이 있습니다. 그렇지 않으면 쉘 매뉴얼을 참조하세요.)
  2. SSH를 통해 원격 시스템에 연결하고 거기서 glob을 실행합니다.ssh host 'echo /*/passwd'
  3. 이스케이프된(또는 백슬래시나 작은따옴표로 제거된) 전역 변수를 원격 시스템에 전달합니다.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쉽게 교체할 수 있습니다.

관련 정보