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/$^array
for 대신array=(a b c)
에 확장될 때 .x/a
x/b
x/c
x/a
b
c
x/$array
(N.)
:glob 한정자: ullglobN
의 경우N
, 일치하는 항목이 없을 경우 glob을 비어 있도록 확장하는 데 사용됩니다..
글로벌 확장을 다음으로 제한정기적인다른 유형의 파일(fifo, 디렉토리, 심볼릭 링크...)은 제외됩니다.