我正在处理以下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/
答案 0 :(得分:1)
您可以使用:
$(dirname "$INVERSE")
完全符合您的要求=)
另外,使用sed的正则表达式:
$(echo "$INVERSE" | sed -e 's,/[^/]*$,/,')
解释正则表达式:
在更换时,我们只是确保不删除最后一个斜杠。
答案 1 :(得分:1)
使用bash 参数展开:
$ x=/public_html/path/to/file/filename.zip
$ echo ${x%/*}/
/public_html/path/to/file/
它具有使用内置的bash 的优点,因此非常轻便。