このスクリプトを実行しようとしても機能しません。
"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