我正在尝试运行这个脚本,但它不起作用。
我想读取“libro.csv”中的每一行(每一行是每个音频的名称),然后将此值分配给 $audio。最后,我想在目录中搜索此音频文件并将其 cp 到新位置
它可以从 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
第一个问题是您的文件是在 Windows 中创建的,因此具有 Windows 样式的行结尾 ( \r\n
) 而不是默认的 UNIX:
$ head -n1 libro.csv | od -c
0000000 a u d i o \r \n
0000007
因此,当您运行脚本时,变量$audio
不是1532365967
but 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