파일에서 읽는 디렉토리의 심볼릭 링크 Glob을 생성합니다.

파일에서 읽는 디렉토리의 심볼릭 링크 Glob을 생성합니다.

tsv 파일의 다섯 번째 열의 디렉터리 이름을 추출 중이며 ExtensionList.tsv확장 폴더 내에 있는 ${HOME}으로 이름이 시작하는 모든 폴더에 대한 심볼릭 링크를 만들고 싶습니다.

awk -F'\t' '{print $5 }' ExtensionList.tsv \
    | xargs -L 1 -I "{}" ln -s -f "${HOME}/{}"* Extension

샘플 Tsv 파일

2   n   xshrim.txt-syntax   Txt Syntax  xshrim.txt-syntax

하고 싶어요 (tsv 파일의 모든 레코드에 대해)

ln -s -f xshrim.txt-syntax* Extension

어떤 제안이 있으십니까?

내 명령이 작동하지 않는 이유는 무엇입니까?

답변1

TSV 파일에서 읽은 각 이름은 별도로 전역으로 확장되어야 합니다. 이는 디렉토리 이름당 한 번씩 호출하여 수행할 수 있습니다 sh -c.xargs

cut -f 5 ExtensionList.tsv | 
  xargs -I {} sh -c 'ln -s -f "$HOME/$1"* Extension/' sh {}

다섯 번째 열의 파일 이름은 공백으로 시작하지 않거나 백슬래시, 작은따옴표 또는 큰따옴표 문자를 포함하지 않는다고 가정합니다. GNU를 통해 구현되면 xargs추가 기능으로 -d '\n'이러한 문제를 해결할 수 있습니다.

sh파일당 하나씩 실행하지 않으려면 다음 을 수행하세요.

cut -f 5 ExtensionList.tsv | 
  xargs sh -c '
    ret=0
    for dirpath do
      ln -s -f "$HOME/$dirpath"* Extension/ || ret=$?
    done
    exit "$ret"' sh

위의 제한 사항 외에도 파일 경로에는 공백이 포함되어서는 안 됩니다. GNU xargs'는 또한 이러한 추가적인 제한을 피합니다 -d '\n'.


인용하다:와일드 카드를 사용하여 심볼릭 링크를 만드는 방법이 있습니까

답변2

그리고 zsh:

typeset -U prefixes=( ${(f)"$(cut -f5 < ExtensionList.tsv)"} )
typeset -U regular_files_with_those_prefixes=( ~/$^prefixes*(N.) )
if (( $#regular_files_with_those_prefixes )); then
  ln -sf -- $regular_files_with_those_prefixes Extensions
fi

어디:

  • typeset -U: 배열 요소가 고유한지 확인합니다(중복 항목 제거).
  • ${(f)"$(cmd)"}cmd: 온라인 요구 사항의 출력을 분할합니다 f.
  • x/$^arrayfor 대신 array=(a b c)에 확장될 때 .x/a x/b x/cx/a b cx/$array
  • (N.):glob 한정자: ullglob N의 경우 N, 일치하는 항목이 없을 경우 glob을 비어 있도록 확장하는 데 사용됩니다. .글로벌 확장을 다음으로 제한정기적인다른 유형의 파일(fifo, 디렉토리, 심볼릭 링크...)은 제외됩니다.

관련 정보