bash의 "while" 및 "find"

bash의 "while" 및 "find"

이 스크립트를 실행하려고 하는데 작동하지 않습니다.

"libro.csv"(각 행은 각 오디오의 이름)의 각 행을 읽은 다음 이 값을 $audio에 할당하고 싶습니다. 마지막으로 이 오디오 파일의 디렉터리를 검색하여 새 위치로 복사하고 싶습니다.

CSV 파일의 각 줄을 읽고 변수에 값을 할당합니다. 그러나 FIND 명령을 실행하려고 하면 작동하지 않습니다.

파일에는 libro.csv파일 이름이 포함되어 있습니다. 예를 들어:

audio
1532365967
1532382681
1538062773

http://www.filedropper.com/libro

내 스크립트:

#!/bin/bash

while IFS= read audio
do
    echo "$audio"
    find /Audios/busqueda/ -name "*$audio*" | xargs -i cp {} /Audios/busqueda/copia
done < libro.csv

다음과 같이 스크립트를 실행합니다.

[root@linux busqueda]# ./buscar.sh audio 1532365967 1532382681 1538062773 

오류 메시지는 나타나지 않지만 파일이 복사되지 않습니다.

답변1

\r\n첫 번째 문제는 파일이 Windows에서 생성되었기 때문에 기본 UNIX 대신 Windows 스타일 줄 끝( )이 있다는 것입니다 .

$ head -n1 libro.csv | od -c
0000000   a   u   d   i   o  \r  \n
0000007

따라서 스크립트를 실행할 때 변수는 변수 값의 일부가 아닙니다 $audio. 이름에 포함된 파일이 없으므로 명령 은 아무것도 반환하지 않으므로 아무것도 복사되지 않습니다.15323659671532365967\r\r\rfind

여기서도 필요하지 않습니다 xargs. 그냥 모든 것을 마무리하는 데 사용할 수 있습니다 find. 수행해야 할 작업의 작업 버전은 다음과 같습니다.

sed 's/\r//g' libro.csv | while IFS= read -r audio; do
    find /Audios/busqueda/ -name "*$audio*" -exec mv {} /Audios/busqueda/copia \;
done

audio헤더는 파일의 일부이므로 헤더도 찾습니다 . 이를 방지하려면 다음을 수행하십시오.

tail -n +2 libro.csv | sed 's/\r//g' | while IFS= read -r audio; do
    find /Audios/busqueda/ -name "*$audio*" -exec mv {} /Audios/busqueda/copia \;
done

관련 정보