ファイルから読み取るディレクトリのシンボリックリンクGlobを作成します。

ファイルから読み取るディレクトリのシンボリックリンクGlobを作成します。

tsvファイルの5番目の列のディレクトリ名を抽出しており、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ファイルから読み取った各名前は、別々にグローバルに拡張する必要があります。これは、ディレクトリ名ごとに1回呼び出して行うことができますsh -cxargs

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

5番目の列のファイル名にはスペースで始まらないか、バックスラッシュ、一重引用符、二重引用符文字を含めないとします。 GNUを介して実装されたら、アドインxargs-d '\n'これらの問題を解決できます。

shファイルごとに1つずつ実行したくない場合は、次のようにします。

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/$^arrayforarray=(a b c)の代わりに拡張されたとき。x/a x/b x/cx/a b cx/$array
  • (N.):glob 修飾子: ullglobNの場合N、一致する項目がない場合 glob を空になるように拡張するために使用されます。.グローバル拡張を次に制限定期的な他の種類のファイル(fifo、ディレクトリ、シンボリックリンク...)は除外されます。

関連情報