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 I echo $put_list두 경우 모두 동일한 것 같습니다. 때로는 $files에 많은 데이터가 있고 많은 시간이 걸리기 때문에 반복하고 싶지 않습니다.

그렇다면 비용이 많이 드는 for 루프 없이 이 작업을 수행할 수 있습니까?

답변1

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

find명령은 발견된 파일을 줄 바꿈(한 줄에 하나의 파일)으로 구분합니다. 실제로 찾기 기능이 필요하지 않은 것 같으므로 사용할 수 있습니다 files=$(echo $line/processed/*).

여기 문서는 다음으로 확장됩니다.

put file1
file2
file3
...

루프를 시도할 때 따옴표를 사용하지 않았으므로 줄 바꿈이 필드 구분 기호로 해석되어 각 파일이 추가한 공백으로 구분되었습니다.

simple now를 사용하면 files=$(echo $line/processed/*) $files파일 사이에 공백만 있으므로 put $files원하는 대로 작동할 것입니다.

관련 정보