기본 Bash for 루프는 한 줄에서 실패하지만 종료되지 않고 출력을 생성하지 않습니다.

기본 Bash for 루프는 한 줄에서 실패하지만 종료되지 않고 출력을 생성하지 않습니다.

file-locations다음 형식의 파일에 긴 위치 목록이 있습니다 .

/mnt/q/fire/210407_NB552563_0007*/analysis/annotation/FIRID-5382*/*.gff 

다음 라이너 중 하나를 사용하여 현재 위치에 복사해 보았습니다.

for i in `cat file-locations`; do cp $i .; done

하지만 그것은 도움이 되지 않습니다. 영원히 "실행"되며 Ctrl+C 없이는 종료되지 않습니다.

내가 뭘 잘못하고 있는지 이해가 안 돼요. 어떤 아이디어가 있나요?

答え1

파일 위치가 제공한 glob과 일치하면 해당 glob을 사용하여 파일 세트와 일치시키기만 하면 됩니다.

cp -v /mnt/q/fire/210407_NB552563_0007*/analysis/annotation/FIRID-5382*/*.gff .

루프도 필요 없고 경로 파일도 필요 없습니다.~하지 않는 한파일 세트는 실제로 glob 패턴과 일치하는 파일의 분리된 세트입니다.

파일 목록을 읽어야 하는 경우 모든 파일 이름에 개행 문자가 포함되어 있지 않다고 가정해야 합니다( touch $'surprise\nname'). 그런 다음 줄 단위로 파일 이름을 읽을 수 있습니다.

while IFS= read -r filename
do
    cp -v "$filename" .
done <file-locations

cp로그 출력 형식을 제어하려면 이 루프의 명령을 다음 두 줄로 바꾸십시오.

    printf "Copying %s: " "$filename" >&2
    cp "$filename" . && echo ok >&2

答え2

답장을 보내주셔서 감사합니다. 나는 그것을 읽으면서 많은 것을 배웠습니다.

솔루션 자체는 매우 간단했습니다. 파일이 약 3MB에 불과하더라도 위치가 NAS에 있다는 사실로 인해 속도가 느려졌습니다(증명).

처음에는 glob이 제안한 대로 어떻게 작동하는지 확인하기 위해 "cp"를 "echo"로 변경해 보았습니다.

for i in `cat file-locations`; do echo $i .; done

이것도 실패했습니다. 그래서 나는 임의의 파일에서 해당 형식을 시도했습니다.

Help /
I /
Need/
Somebody/

이는 이 진술이 논리적이라는 것을 완벽하게 보여줍니다. 그런 다음 방금 파일 위치를 추가했습니다. 20초정도 걸렸는데 파일이 복사되었습니다. 그런 다음 나머지 30개 정도의 파일을 추가했습니다. 아무것도 하지 않은 것처럼 보였지만 20분(매우 긴 시간) 후에 모든 파일이 성공적으로 복사되었습니다.

의견을 보내주신 모든 분들께 다시 한 번 감사드립니다 :)

関連情報