0

我正在处理以下 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/
4

2 回答 2

1

你可以使用:

$(dirname "$INVERSE")

完全符合您的要求 =)

此外,将正则表达式与 sed 一起使用:

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

解释正则表达式:

  1. 匹配斜线
  2. 尽可能多地匹配不是斜线的字符
  3. 匹配行尾

在替换时,我们只是确保不删除最后一个斜线。

于 2012-10-03T00:15:01.893 回答
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

于 2012-10-03T00:22:20.247 回答