그래서 내 스크립트는 다음과 같습니다
#...
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
원하는 대로 작동할 것입니다.