権限のないパスを変数に入れようとします。

権限のないパスを変数に入れようとします。

ディレクトリに興味のあるファイルが20個あります。 5つのグループに分けられ、各グループはファイル名に626から630の数字で識別されます。例えば(仮説的に) the-quick-brown-fox-jumps-over-627-lazy-dogs_1_bbduk.fq

各グループを繰り返し、ファイルパスをテキスト変数として一時的に保存したい(ループの他のコマンドと一緒に使用for)。これが私が今持っているものです:

for i in {626..630};do
  fw1=$(/scratch/[username]/data/*"$i"-*_1_bbduk.fq)
  fw2=$(/scratch/[username]/data/*"$i"_*_1_bbduk.fq)
  rv1=$(/scratch/[username]/data/*"$i"-*_2_bbduk.fq)
  rv2=$(/scratch/[username]/data/*"$i"_*_2_bbduk.fq)
done

問題:正しいパスを取得しましたが(パスごとに1つのオプションのみ)、「権限が拒否されました」と表示され、後で変数をテキストとして使用できないようです。 bashがそれを実行しようとしているようですが、これは私が望むものではありません。

私は周りに一重引用符を追加してみました(例:fw1='$(/scratch/[username]/data/*"$i"-*_1_bbduk.fq)'ワイルドカードが削除されました。二重引用符( "")を考えましたが、 "$i"変数をめちゃくちゃにせずにそれを使用する方法がわかりません。たとえば、試してみましたが、echoまだfw1=echo $(/scratch/[username]/data/*"$i"-*_1_bbduk.fq)"権限拒否」の問題があります。

ベストアンサー1

Bashは各ファイルを次のようにラップするため、ファイル名を指定しようとします。

$( ... )

これが望ましくない場合は、次を使用してください。

for i in {626..630}; do
  fw1=/scratch/[username]/data/*"$i"-*_1_bbduk.fq
  fw2=/scratch/[username]/data/*"$i"_*_1_bbduk.fq
  rv1=/scratch/[username]/data/*"$i"-*_2_bbduk.fq
  rv2=/scratch/[username]/data/*"$i"_*_2_bbduk.fq
done

編集する:

あなたのコメントによると、次のコードはあなたが望むものかもしれません。

for i in {626..630}; do
  fw1="$(compgen -G /scratch/[username]/data/*"$i"-*_1_bbduk.fq)"
  fw2="$(compgen -G /scratch/[username]/data/*"$i"_*_1_bbduk.fq)"
  rv1="$(compgen -G /scratch/[username]/data/*"$i"-*_2_bbduk.fq)"
  rv2="$(compgen -G /scratch/[username]/data/*"$i"_*_2_bbduk.fq)"
done

おすすめ記事