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

関連情報