Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

This question already has an answer here:

When I want to navigate into directories having special characters in their names I get an error message.

For example:

aman@desktop:~/Aman$ cd !)e$!gn&(reate
bash: !: event not found
aman@desktop:~/Aman$ 

Here !)e$!gn&(reate is the directory name where I want to navigate.

How to rectify this error?

How to use cd command to navigate directories in Ubuntu having directory name with special characters?

share|improve this question

marked as duplicate by Radu Rădeanu, Avinash Raj, Braiam, i08in, Aditya Apr 24 at 10:36

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

1  
You can turn off history expansion: set +H -- turn it back on with set -H –  glenn jackman Apr 23 at 16:24

5 Answers 5

That error is happening because the ! (bang) is a shortcut that allows you re-run a command from your history. Ex: This command re-runs command #1504 from my history.

$ !1504

To avoid that issue, try encapsulating your directory name with single quotes.

$ cd '!)e$!gn&(reate'

That being said, while Ubuntu (Linux) will let you name directories in this way, I would highly recommend against it. Using special characters in directory names can make them difficult to read, and if you are using a reserved character you will always need to escape it or encapsulate the directory name in quotes.

share|improve this answer
1  
+1 especially for the last paragraph... and if they can avoid spaces too, will be grateful in the future. Just MHO. –  Rmano Apr 23 at 16:41
    
@Rmano Yes, I'm with you on that. Spaces in directory/file names drive me crazy. –  BryceAtNetwork23 Apr 23 at 16:54
2  
set +H or set +o histexpand to disable the special treatment of !. Add that to your ~/.bash_profile or even some system-wide config file and you'll have one less thing to worry about. Unless you are actually using this feature, that is. –  MvG Apr 23 at 22:28
    
I'm not sure what this is called, but I call it "passing the file name as a string" since that is what it would be called in programming. –  JFA Apr 24 at 1:02

You use \ before special characters

cd \!\)e\$\!gn\&\(reate

You can also put entire foldername in single quotes

cd '!)e$!gn&(reate'

You can encapsulate entire path within single quotes

cd 'Desktop/!)e$!gn&(reate'

if you want to refer a path inside /home/username directory: just add ~/ before path in single quotes

cd ~/'Desktop/!)e$!gn&(reate'
share|improve this answer

Interactively, type cd ! then hit Tab and bash will fill in the rest, properly escaped.

share|improve this answer
    
Will that work even if the first character is a special character, or will you have to type cd \! then TAB? –  IQAndreas Apr 24 at 4:19
    
works for me without escaping. –  glenn jackman Apr 24 at 10:28

Not sure if this applies to special characters, but perhaps put the path inside double quotes?

share|improve this answer
2  
Double quotes will help with special characters like spaces that aren't interpolated, but won't help with $, ! and the like, which are interpolated. There are two types of strings in bash: double quotes, which allow for interpolation, and single quotes, which don't. (This is why you should always put your regex for grep, sed, etc. in single quotes.) –  Livius Apr 23 at 22:03

Confirming @glenn jackman's answer works in practise, I typed cd ! and then pressed [tab]

ianh@abe:~/tmp$ mkdir '!)e$!gn&(reate' ianh@abe:~/tmp$ cd \!\)e\$\!gn\&\(reate/ ianh@abe:~/tmp/!)e$!gn&(reate$

Even making a directory with '!1997' and typing cd !1 and then pressing [tab] worked.

ianh@abe:~/tmp/!)e$!gn&(reate$ mkdir '!1997' ianh@abe:~/tmp/!)e$!gn&(reate$ cd \!1997/ ianh@abe:.../!)e$!gn&(reate/!1997$

(i dont have enough rep points to add it as a comment)

share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.