変数を別の変数に保存

変数を別の変数に保存

forループ内のある変数の内容を別の変数に保存しようとしていますが、次の結果が表示されます。

0403-006 Execute permission denied

助ける。

while IFS='|' read -r col1 col2 col3 col4 col5 col6 col7
do 
for f in directory/*
    do
        files=$($f | awk -F "_" '{print $3}')
        echo $files
    done
done <test.txt

私はこのプログラムを実行するための完全な権限を持っており、echo $filesと入力するとエラーが発生します。

答え1

スクリプトが実行する操作は非常に不明瞭で、完全に間違っているようです。正確に何が間違っていて何を達成したいのかを知るには、より詳細な情報を提供する必要があります。私の考えでは、エラーは次の行で発生するようです。

files=$($f | awk -F "_" '{print $3}')

特にここで何が起こっているのかを理解する必要があります。

$f | awk -F "_" '{print $3}'

実行中です$f。これはファイルの1つですdirectory/*。そのうちの1つは0403-006実行できないことです。

変数などcol1はどうですかcol2?読み取ったデータはtest.txtまったく使用されません。

私の推測が正しい場合でもスクリプトは正常に見えないため、入力データと予想される出力を含む最小限の完全な例を提供してください。

答え2

見ているあなただけの答え、実際にやりたいことが何かより明確になります。

私の意見は次のとおりです。

#!/bin/sh

dupsfile='/archival/test/sppark/dataindex/staging/duplicates.txt'

indir='/archival/test/sppark/datapdf/staging/renamedTriage'
baddir='/archival/test/sppark/datapdf/staging/badFiles'

dups=$( mktemp )
cut -d '|' -f 4 <"$dupsfile" >"$dups"

for pathname in "$indir"/*; do
    [ ! -f "$pathname" ] && continue

    string=$( printf '%s\n' "${pathname##*/}" | cut -d '_' -f 4 )

    if grep -qxF "$string" "$dups" then
        echo mv "$pathname" "$baddir"
    fi
done

rm "$dups"

自分の答えとこれの違いは、ファイルのリストがデータファイルの各行に対して1回ではなく1回だけ生成されることです。

データファイルは、|4番目に区切られた列を抽出して一時ファイルに保存することで解析されます。調査中のディレクトリ内の各ファイルに.が使用されますgrep。ファイル名の 4 番目の_区切りビットがその一時ファイルにある場合、ファイルは移動されます。echo実際にファイルを移動するには削除してください。

答え3

私が望むものを正確に実行するようにスクリプトを修正しました。

while IFS='|' read -r col1 col2 col3 col4 col5 col6 col7
do 
    for f in /archival/test/sppark/datapdf/staging/renamedTriage/*
    do
        files=$(echo "$f" | awk -F "_" '{print $4}')
        if [[ $col4 == $files ]]; then
            mv $f /archival/test/sppark/datapdf/staging/badFiles/
        fi
    done
done </archival/test/sppark/dataindex/staging/duplicates.txt

私のwhileループは私のtxtファイルを読み取り、|で区切られた各列を読み取ります。私のディレクトリ内の各ファイルを繰り返すforループがあり、私の$col4値が同じ$files場合、ファイルは私が指定したディレクトリに移動します。

関連情報