ディレクトリに興味のあるファイルが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