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

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

디렉터리의 일부가 길고 알 수 없는 문자열인 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. 이스케이프된(또는 백슬래시나 작은따옴표를 통해 변형된) 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쉽게 교체할 수 있습니다.

관련 정보