Unix for 루프가 작동하지 않습니다.

Unix for 루프가 작동하지 않습니다.

간단한 bash 스크립트가 있습니다. 과불화 피드백:

CWD=/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder
cd $CWD
for i in `cat req_files.txt`
do
echo "file_found : $i">a.txt
done

참고: req_files.txt에는 이 디렉터리에서 찾아야 하는 파일 목록이 있습니다. 파일이 발견되면 발견된 파일의 이름을 나열하고 "a.txt"로 인쇄해야 합니다.

req_files.txt에는 여러 파일이 있지만 첫 번째 파일 이름만 인쇄되고 나머지는 인쇄되지 않습니다. 도와주세요.

답변1

반복할 때마다 a.txt의 내용을 덮어쓰는 것 같습니다.

echo "file_found : $i">a.txt

>로 교체해야 합니다 >>.

또는 매번 열고 닫는 일이 없도록 작업이 끝난 후에 배치하세요. 이것을 다른 답변에 추가하여 제공하십시오.

done < req_files.txt > a.txt

지금까지 표시된 내용을 저장할 필요가 없기 때문에 추가하는 대신 열어 두었습니다.

답변2

공백/탭/등이 포함된 줄을 파일에서 읽으려면 while대신 루프를 사용해야 합니다.for

CWD=/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder
cd $CWD
while read i
do
echo "file_found : $i">a.txt
done < req_files.txt

답변3

코드에는 지정된 디렉터리를 검색하고 해당 디렉터리 내의 파일을 지정된 파일(req_files.txt)과 비교하는 줄이 포함되어 있지 않습니다. 당신이 하는 일은 a.txt 및 req_files.txt 파일의 내용을 하나씩 계속 덮어쓰는 것(사용 중이므로 >추가 연산자 사용)이며, 스크립트 실행이 끝나면 마지막 항목만 남게 됩니다. >>가.txt.

제가 이해한 바로는 귀하의 목표는 다음과 같습니다.

지정된 경로 내의 모든 파일을 검색하고 나열합니다. 그런 다음 이 목록은 req_files.txt에 나열된 파일과 비교됩니다. 마지막으로 일치하는 콘텐츠가 출력 파일 a.txt에 나열됩니다. 이 경우 아래 코드를 사용하면 됩니다.

cwd=/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder
cd $cwd #change dir to the required path
>a.txt  # create output file a.txt
for file in `ls`:
do
        grep "`echo "$file"`" req_files.txt >> a.txt
done

for 루프 내에서 이제 ls 명령을 사용하여 파일을 나열합니다. 이 스크립트는 주어진 경로에 존재하는 req_files.txt의 파일을 포함하는 a.txt 파일을 주어진 경로 내에 생성합니다.

답변4

루프가 반복될 때마다 출력 파일을 잘라냅니다(비어 있습니다).

또한 출력을 통해 반복하고 있는데 cat, 이는 쉘이 출력을 공백, 탭 및 줄 바꿈(기본적으로)으로 분할하고 결과에 대해 파일 이름 글로빙을 수행하기 때문에 위험합니다. 한 줄이 표시되면 *현재 디렉터리의 모든 파일 이름으로 대체됩니다.

대신에:

cd /cygdrive/c/Users/abhisek.samanta/Desktop/New_folder || exit 1

while IFS= read -r line; do
    printf 'File found: %s\n' "$line"
done <req_files.txt >a.txt

이는 파일에서 읽고 req_files.txt루프의 출력을 작성합니다 a.txt. a.txt출력을 파일에 쓰기 전에 파일이 잘립니다. 존재하지 않는 경우 생성됩니다.

당신은 원하십니까?추가의기존 파일로 출력하려면 >>대신 을 사용하십시오 >.

또한보십시오:

관련 정보