Shスクリプトはftpを使用してファイルのリストを配置します。

Shスクリプトはftpを使用してファイルのリストを配置します。

だから私のスクリプトは次のようになります

#...
files="$(find $line/processed/* 2>/dev/null)" #2>/dev/null used for error output suppression
if [[ ! -z "$files" ]]
then
                    #put_list="put"
                    #for word in $files; do
                    #       put_list="$put_list"$' '"$word"
                    #done

                    put_list="put $files" 
                    rm_list="rm $files"
yafc ftp://[email protected]  <<**
$put_list
close
quit
**
#...

したがって、これを使用すると、yafcで次のエラーが発生します。

...
yafc 192.168.178.54:~/> No such command '/mnt/dir/processed/19,11,2014-14,17,25,,313', try 'help'
yafc 192.168.178.54:~/> No such command '/mnt/dir/processed/19,11,2014-14,17,41,,649"
...

すべてのファイルがここにリストされています。最初のファイルのみが$filesホストに配置されます。

しかし、これを使用する場合:(上記のコードでコメントアウトされた内容)

put_list="put"
for word in $files; do
     put_list="$put_list"$' '"$word"
done

すべてが完璧です!では、違いは何ですか?私はこれをtr削除しようとしています'\n'。 If Iecho $put_listどちらの場合も同じようです。時々$filesに多くのデータがあり、多くの時間がかかるので、繰り返したくありません。

それでは、高価なforループなしでこれを実行できますか?

答え1

files=$(echo $line/processed/*)
yafc ftp://[email protected]  <<**
put $files
close
quit
**

このfindコマンドは、見つかったファイルを改行(1行に1つのファイル)に分割します。実際に検索機能が不要なようですので使用できますfiles=$(echo $line/processed/*)

ここでのドキュメントは次に展開されます。

put file1
file2
file3
...

ループを試みるときに引用符を使用しなかったため、改行はフィールド区切り文字として解釈され、各ファイルによって追加されたスペースで区切られました。

simple nowを使用すると、files=$(echo $line/processed/*) $filesファイル間にスペースがあるため、put $files必要に応じて機能します。

関連情報