이 스크립트를 실행하려고 하는데 작동하지 않습니다.
"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
. 이름에 포함된 파일이 없으므로 명령 은 아무것도 반환하지 않으므로 아무것도 복사되지 않습니다.1532365967
1532365967\r
\r
\r
find
여기서도 필요하지 않습니다 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