2013-11-25 37 views
5

我正在使用卸载程序脚本来删除安装脚本的父文件夹。检索脚本的父目录

/usr/local/Myapplication/Uninstaller/uninstall.sh 

所以uninstall.sh必须做到这一点:

rm- rf /usr/local/Myapplication 

位置的卸载驻留

SYMLINKS=$(readlink -f "$0") 
UNINSTALL_PATH=$(dirname "$SYMLINKS") 

但我还是不确定的非常办法让我可以检索的文件夹父路径。 我想用sed去除这个路径中的“Uninstaller”部分,但是有没有一种优雅的方式来获取MyApplication文件夹的路径来删除它?

谢谢

+0

:'CD “$(目录名称 ”$ 0“)” && CD .. && CD .. && [-d妙应用程序/卸载程序] && rm -rf Myapplication'(我添加了一个检查表明我们要删除的目录包含一个子目录“Uninstaller”,但是您可以添加一个更好的检查,例如MyApplication中的必要文​​件?)。如果你不知道MyApplication,那么:'cd“$(dirname $ 0)”&& cd .. && zepath =“$(pwd)”&& cd .. && [-f“$ {zepath}/somefilesthathouldbehere”] && rm -rf“$ {zepath}”' –

+0

查看着名的[可以Bash脚本告诉它存储在什么目录?](http://stackoverflow.com/questions/59895/can-a-bash-script-tell- what-directory-its-storage-in)问题,然后从那里输入cd ..'。 –

回答

9

如何使用dirname两次?

APP_ROOT="$(dirname "$(dirname "$(readlink -fm "$0")")")" 

引用desaster只是为了防止路径中的空白。否则它会更顺眼:

APP_ROOT=$(dirname $(dirname $(readlink -fm $0))) 
+0

这工作,但我有点用if两次使用dirname实现我想要的。更多的学习目的是有办法让它在一个单一的命令行?确定'APP_ROOT = $(dirname“''$(readlink -f”$ 0“)''”)'会起作用,但有没有其他方法? –

+0

你不需要担心。 'dirname'是为了给你路径目录的一部分而量身定做的。这是正确的工具。我更新了语法的答案。 – Boldewyn

+0

注意,这个方法对于“丑陋”的名字是不安全的。像“-rm -rf”这样的名称会打破所需的行为。可能是“。”也会。我不知道这是否是最好的方法,但我在这里创建了一个单独的“正确性为重点”的问题:http://stackoverflow.com/questions/40700119/get-parent-directory-for-a-file- in-bash – VasyaNovikov

0

你为什么不干脆在路径的末尾添加../?

+0

这不适用于rm,UNINSTALL_PATH = $(dirname“$ SYMLINKS”)/../与rm命令一起使用时不是正确的父路径 –

+2

您还需要添加'/../'。如果因为某种原因'$ UNINSTALL_PATH'为空,'/../ == /'并且您正在擦除硬盘驱动器。 – Boldewyn

4

刚刚获得的父目录的父:

my_app_path=$(dirname $(dirname $(readlink -f "$0"))) 
3

如果你需要一个绝对路径,那么你需要cd。否则,你可以只使用$(dirname $0)/..

cd $(dirname $0)/.. 
path=$(pwd) 
cd - # go back 
4

获取父目录路径的终极简单的方法:

PARENT_DIRECTORY="${PWD%/*}" 
+2

这是当前目录的父目录,而不是脚本所在的位置。为了使用它,我必须首先将CD放入脚本目录,这样它就不会太优雅。 –

2

完整路径脚本的父目录,即“在/ usr/local/bin目录/喇嘛” :export PARENT_OF_THIS_SCRIPT=$(cd $(dirname $0) ; pwd -P)

只是脚本的最近父,即 “喇嘛”:export PARENT_DIR_OF_SCRIPT=$(cd $(dirname $0) ; pwd -P | xargs basename)

在你的脚本