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
. 이것은 파일 중 하나입니다 directory/*
. 그 중 하나는 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"
자신의 답변과 이것의 차이점은 파일 목록이 데이터 파일의 각 줄에 대해 한 번이 아니라 한 번만 생성된다는 것입니다.
데이터 파일은 |
네 번째로 구분된 열을 추출하고 임시 파일에 저장하여 구문 분석됩니다. 조사 중인 디렉터리의 각 파일에 대해 .이 사용됩니다 grep
. 파일 이름의 네 번째 _
구분 비트가 해당 임시 파일에 있으면 파일이 이동됩니다. 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
하면 파일을 내가 지정한 디렉토리로 이동합니다.