我怎么能追加' \'在文件名中的空格前面?

时间:2014-06-05 01:43:08

标签: bash

我正在开发一个可以使用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}"

为了处理带空格的文件名,如何在文件名中的空格前面附加\

4 个答案:

答案 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)

您可以尝试重命名该文件,并在完成后重新命名。