我正在开发一个可以使用sftp程序传输文件的程序:
sftp -oBatchMode=no -b ${BATCH_FILE} user@$123.123.123.123:/home << EOF
bye
EOF
我的一个要求是我必须有一个BATCH_FILE
使用sftp
和批处理文件是使用以下脚本生成的:
files=$(ls -1 ${SRC_PATH}/*.txt)
echo "$files" > ${TEMP_FILE}
while read file
do
if [ -s "${file}" ]
then
echo ${file} >> "${PARSE_FILE}" ## line 1
fi
done < ${TEMP_FILE}
awk '$0="put "$0' ${PARSE_FILE} > ${BATCH_FILE}
不知怎么的,我的程序不能处理有空间的文件。我确实尝试使用以下代码来替换第1行,但失败了,这将显示filename.txt。
newfile=`echo $file | tr ' ' '\ '`
echo ${newfile} >> "${PARSE_FILE}"
为了处理文件名与空间,我怎么能追加一个在前面的空间内的文件名?
问题
问题是tr SET1 SET2
将用SET2
中的第n个字符替换SET1
中的第n个字符,这意味着您有效地通过替换每个空格,而不是在每个空格之前添加反斜杠。
解决方案
在使用可能包含空格的变量时,而不是手动尝试修复缺失的空格;把它用引号括起来,让shell为你处理这个麻烦。
请看下面的例子:
$ echo $FILENAME
file with spaces.txt
<一口>一口>
$ ls $FILENAME
ls: cannot access file: No such file or directory
ls: cannot access with: No such file or directory
ls: cannot access spaces.txt: No such file or directory
<一口>一口>
$ ls "$FILENAME"
file with spaces.txt
但是我真的想换掉一些东西…
好吧,如果你真的想用一个命令把每个' '
(空格)变成' '
(反斜杠,空格),你可以使用sed
和一个基本的替换模式,如下所示:
$ echo "file with spaces.txt" | sed 's, ,\ ,g'
file with spaces.txt
我还没有仔细研究您在这里要做什么,但是我知道bash可以处理带有空格的文件名,如果您对它们加双引号的话。为什么不尝试引用每个文件名变量,看看是否有效?你引用了其中的一些,但还不是全部。
试试这些:"${newfile}"
或"$newfile" "$file" "$tempfile"
等等
如果使用Bash,可以进一步简化代码:
function generate_batch_file {
for FILE in "${SRC_PATH}"/*.txt; do
[[ -s $FILE ]] && echo "put {$FILE// /\ }"
done
}
sftp -oBatchMode=no -b <(generate_batch_file) user@$123.123.123.123:/home <<< "bye"
您可以尝试重命名文件以使其工作,并在完成后再次重命名。