我正在开发一个可以使用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}"
为了处理带空格的文件名,如何在文件名中的空格前面附加\
?
答案 0 :(得分:2)
问题是,tr SET1 SET2
会将SET1
中的第N 个字符替换为SET2
中的第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
答案 1 :(得分:1)
我没有仔细查看你在那里尝试做什么,但我知道bash可以处理带有空格的文件名,如果你加倍引用它们。为什么不尝试引用每个文件名变量,看看是否有效?你引用了其中一些,但还没有引用它们。
请尝试以下操作:"${newfile}"
或"$newfile" "$file" "$tempfile"
等...
答案 2 :(得分:1)
如果您使用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"
答案 3 :(得分:0)
您可以尝试重命名该文件,并在完成后重新命名。