Get file directory path from file path
在巴什,如果
1 2 3 4 5 6 7 8 9 | $ VAR=/home/me/mydir/file.c $ DIR=$(dirname"${VAR}") $ echo"${DIR}" /home/me/mydir $ basename"${VAR}" file.c |
它们不是内部bash命令,但它们是posix标准的一部分(参见
1 2 3 4 5 6 7 | $ export VAR=/home/me/mydir/file.c $ export DIR=${VAR%/*} $ echo"${DIR}" /home/me/mydir $ echo"${VAR##*/}" file.c |
避免依赖
在相关的注释中,如果您只有文件名或相对路径,那么单独使用
1 2 3 | fname='txtfile' echo $(dirname"$fname") # output: . echo $(readlink -f"$fname") # output: /home/me/work/txtfile |
然后,您可以将这两者结合起来,得到目录。
1 | echo $(dirname $(readlink -f"$fname")) # output: /home/me/work |
如果您希望目标文件是符号链接,首先可以检查它并获取原始文件。下面的if子句可以帮助您。
1 2 3 4 5 6 | if [ -h $file ] then base=$(dirname $(readlink $file)) else base=$(dirname $file) fi |
我在玩这个,想出了另一个办法。
1 2 3 4 5 6 | $ VAR=/home/me/mydir/file.c $ DIR=`echo $VAR |xargs dirname` $ echo $DIR /home/me/mydir |
我喜欢的部分是很容易扩展备份树:
1 2 3 4 | $ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname` $ echo $DIR /home |
这是我用于递归剪裁的脚本。当然,用您想要的目录替换$1。
1 2 3 4 5 6 7 8 9 10 11 | BASEDIR="$1" IFS=$' ' cd $BASEDIR for f in $(find . -type f -name ' *') do DIR=$(dirname"$f") DIR=${DIR:1} cd $BASEDIR$DIR rename 's/^ *//' * done |
首先,我用空位(
1 2 3 4 | $ VAR="/home/me/mydir/file.c" $ echo $VAR | tr '/' ' ' | sed 's/^.* / /' | cut -c2- file.c |