LFTP将文件放在特定目录中?

时间:2012-10-03 00:10:28

标签: regex bash shell

我正在处理以下bash脚本,我需要上传超过10 MB的特定文件:

#!/bin/sh

FTP_HOST=ftp.ftphost.com
FTP_USER=myftpuser
FTP_PASS=securepassword

[[ -n "$1" ]] || { echo "Usage: findlarge [PATHNAME]"; exit 0 ; }
FILES=`find "$1" -type f -size +10000k -printf '%p;'`

OLD_IFS="$IFS"
IFS=";"
FILES_ARRAY=( $FILES )
IFS="$OLD_IFS"

for fl in "${FILES_ARRAY[@]}"
 do
   INVERSE=`${fl//\/var\/www\/html/\/public_html}`
   lftp -u $FTP_USER,$FTP_PASS -e "cd '${INVERSE}'; put '${fl}';quit" $FTP_HOST
 done

它用于特定的CDN,需要更大的文件上传到他们的服务器它正在尝试做什么以及我不知道如何继续,主机端的文件可以在/var/www/html/但是远程找到服务器需要将它们放在/public_html/。我需要在远程服务器上使用与在主机服务器上相同的文件结构。

我遇到的问题是$INVERSE仍然包含实际的文件名和路径..我需要一种方法来修剪INVERSE变量中的文件名,这样我才能正确地将文件放在正确的位置。目录

有没有人知道正则表达式声明可以采取类似的行为:

/public_html/path/to/file/filename.zip

并将其更改为

/public_html/path/to/file/

2 个答案:

答案 0 :(得分:1)

您可以使用:

$(dirname "$INVERSE")

完全符合您的要求=)

另外,使用sed的正则表达式:

$(echo "$INVERSE" | sed -e 's,/[^/]*$,/,')

解释正则表达式:

  1. 匹配斜杠
  2. 尽可能多地匹配不是斜杠的字符
  3. 匹配行尾
  4. 在更换时,我们只是确保不删除最后一个斜杠。

答案 1 :(得分:1)

使用bash 参数展开

$ x=/public_html/path/to/file/filename.zip
$ echo ${x%/*}/
/public_html/path/to/file/

它具有使用内置的bash 的优点,因此非常轻便。

请参阅http://wiki.bash-hackers.org/syntax/pe