changing to parent directory in unix

2019-04-20 03:53发布

in general we use

cd .. for going to the parent directory

cd ../../ to go to the parents parent directory. and

cd ../../../../../ for 5th parent directory.

is there any simplified way of doing this?

shell i am using is ksh.

10条回答
放我归山
2楼-- · 2019-04-20 04:16

For Bourne-type shells (including ksh), you could write a shell function:

cdup() {
    set -- "${1-1}"
    while test "$1" -gt 0; do
      cd ..
      set -- "$(($1-1))"
    done
}
查看更多
Anthone
3楼-- · 2019-04-20 04:16

I wrote a shell utility for this use case: https://github.com/kkew3/cdup. As some examples:

  • to go 4 directories upward, use up -4.
  • to go to the nearest parent directory matching globbing pattern site*, use up '/site*/'.
  • to go to the nearest parent directory matching regex [pP]roj(ect)?, use up -E '[pP]roj(ect)?'.
查看更多
够拽才男人
4楼-- · 2019-04-20 04:16

You need to be careful if you setup any aliases like this. You will not always go up 5 directories when you cd ../../../../... If you are only 2 or 3 directories down from / you will wind up in /. Try this for yourself.

$ cd ~
$ pwd
/home/you
$ cd ../../../..
$ pwd
/

This happens because the parent directory of / is in fact /.

查看更多
孤傲高冷的网名
5楼-- · 2019-04-20 04:17

You can check out the recent project bd

If you are in this path

/home/user/project/src/org/main/site/utils/file/reader/whatever 

and you want to go to site directory quickly (instead of typing cd ../../../..),
then just type:

bd site
查看更多
我只想做你的唯一
6楼-- · 2019-04-20 04:28

This is generally how I do it. Of course in ksh you may have your navigation keys set to something else. When I used ksh I used have them set to vi style so that would be k instead of up arrow.

In shell scripts it is better to be explicit. If you can use an absolute pathname then do so and run a command like:

cd /webdata/cgi-bin

If the script may be run to act on files in different directories, then you could consider something like this:

TOPDIR="/webdata"
cd $TOPDIR/cgi-bin

But if you really can't do either of those then stick to .. chains like so:

chmod +x *.py
cd ../../../cgi-bin

This is quite clear. Perform an action in the current working directory, then navigate up 3 levels and select the cgi-bin directory. Anyone who would be capable of understanding what you are doing in the shell script should have no difficulty in following this. If your script is really complex, then it would help to add some comments like this:

# change to TOPDIR/cartsys/production/code/python
cd python    
chmod +x *.py
cd ../../../cgi-bin

The implication is that you were in the code directory and changed down one level to python, therefore the reader who forgot where you were in the directory hierarchy sees a reminder to help them count up 3 levels.

cd ..

<up arrow><ENTER>
<up arrow><ENTER>
<up arrow><ENTER>
<up arrow><ENTER>
查看更多
看我几分像从前
7楼-- · 2019-04-20 04:29

This function is for Bash, but something similar could be done for others (this may work as-is in ksh and zsh):

cdn () { pushd .; for ((i=1; i<=$1; i++)); do cd ..; done; pwd; }

Example usage:

/some/dirs/and/subdirs$ cdn 3
/some/dirs/and/subdirs /some/dirs/and/subdirs
/some
/some$ popd
/some/dirs/and/subdirs$

Here's a function that will cd to a named subdirectory above the current working directory:

cdu () { cd "${PWD%/$1/*}/$1"; }

Example usage:

/usr/share/atom/resources/app/apm/src/generator$ cdu apm
/usr/share/atom/resources/app/apm$ cdu resources
/usr/share/atom/resources$ cd -
/usr/share/atom/resources/app/apm$ cdu share
/usr/share
查看更多
登录 后发表回答