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
場合、ファイルは私が指定したディレクトリに移動します。