如何在文件名中的空格前面附加"\"?

  • 本文关键字:前面 空格 文件名 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}"

为了处理文件名与空间,我怎么能追加一个在前面的空间内的文件名?

问题

问题是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"

您可以尝试重命名文件以使其工作,并在完成后再次重命名。

相关内容

最新更新