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