82

So I'm trying to git clone and cd into that directory using Google collab - but I cant cd into it. What am I doing wrong?

!rm -rf SwitchFrequencyAnalysis && git clone https://github.com/ACECentre/SwitchFrequencyAnalysis.git

!cd SwitchFrequencyAnalysis

!ls datalab/ SwitchFrequencyAnalysis/

You would expect it to output the directory contents of SwitchFrequencyAnalysis - but instead its the root. I'm feeling I'm missing something obvious - Is it something to do with being within the python interpreter? (where is the documentation??)

Demo here.

Community
  • 1
  • 1
willwade
  • 1,259
  • 1
  • 11
  • 20
  • 3
    Bob Smith's answer below is the right way to go, but if you're curious why the approach above didn't work: the issue is that each of the `!`-prefixed commands runs in its own subshell -- so the `!cd` starts a new shell, switches directories, and then kills that shell. The `!ls` then starts anew in the current directory. Doing `!cd SwitchFrequencyAnalysis && ls` would have worked, but using python's `os.chdir` is the cleaner approach here. – Craig Citro Jan 18 '18 at 07:43

5 Answers5

124

use

%cd SwitchFrequencyAnalysis

to change the current working directory for the notebook environment (and not just the subshell that runs your ! command).

you can confirm it worked with the pwd command like this:

!pwd

further information about jupyter / ipython magics: http://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-cd

Fabian Linzberger
  • 1,341
  • 1
  • 7
  • 5
65

As others have pointed out, the cd command needs to start with a percentage sign:

%cd SwitchFrequencyAnalysis

Difference between % and !

Google Colab seems to inherit these syntaxes from Jupyter (which inherits them from IPython). Jake VanderPlas explains this IPython behaviour here. You can see the excerpt below.

If you play with IPython's shell commands for a while, you might notice that you cannot use !cd to navigate the filesystem:

In [11]: !pwd 
/home/jake/projects/myproject

In [12]: !cd ..

In [13]: !pwd 
/home/jake/projects/myproject 

The reason is that shell commands in the notebook are executed in a temporary subshell. If you'd like to change the working directory in a more enduring way, you can use the %cd magic command:

In [14]: %cd ..
/home/jake/projects

Another way to look at this: you need % because changing directory is relevant to the environment of the current notebook but not to the entire server runtime.

In general, use ! if the command is one that's okay to run in a separate shell. Use % if the command needs to be run on the specific notebook.

Simon Seo
  • 761
  • 5
  • 7
41

Use os.chdir. Here's a full example: https://colab.research.google.com/notebook#fileId=1CSPBdmY0TxU038aKscL8YJ3ELgCiGGju

Compactly:

!mkdir abc
!echo "file" > abc/123.txt

import os
os.chdir('abc')

# Now the directory 'abc' is the current working directory.
# and will show 123.txt.
!ls
Bob Smith
  • 26,929
  • 9
  • 72
  • 69
  • great! so, does `/content` and `/root` points to the same folder location. I mean I have a hard time understanding how the commands in googleColab related to the underlying Linux-VM filesystem. Since either you execute `%cd /content | ls` or `!ls -la | pwd` you will end up seeing `/root/.kaggle` which was created using the command set `!pip install -U -q kaggle` followed by `!mkdir -p ~/.kaggle`, that means `~/` which is home directory is equivalent to `/root` & `/content`, are those – Anu Feb 01 '19 at 13:14
30

If you want to use the cd or ls functions , you need proper identifiers before the function names ( % and ! respectively) use %cd and !ls to navigate

.

!ls    # to find the directory you're in ,
%cd ./samplefolder  #if you wanna go into a folder (say samplefolder)

or if you wanna go out of the current folder

%cd ../      

and then navigate to the required folder/file accordingly

zsfVishnu
  • 350
  • 3
  • 8
  • 3
    could you please point to the source where I can find the above usage? also, I am looking for using pipeline operator `|` as we do use in bash shell scripting, any suggestions in that regards? Also, what the distinction between using `%` or `!` – Anu Feb 01 '19 at 12:54
13
!pwd
import os
os.chdir('/content/drive/My Drive/Colab Notebooks/Data')
!pwd

view this answer for detailed explaination https://stackoverflow.com/a/61636734/11535267

Nikita Bachani
  • 311
  • 3
  • 8
  • 1
    Will also add that you have to first mount Google Drive in Colab and grant Google Drive File Stream authorization. – Princy Aug 17 '20 at 11:18