bash 中的“while”和“find”

bash 中的“while”和“find”

我正在尝试运行这个脚本,但它不起作用。

我想读取“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不是1532365967but 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

相关内容