기본 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

おすすめ記事