3
touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\') 2> /dev/null

where foo is a directory

It's reading the full pathname of foo and creating it as a file replacing all '/' with '\' and putting a directory_ in front so the directory /home/test/foo would create a file directory_\home\test\foo

It does exactly what I want except a warning keeps printing tr: warning: an unescaped backslash at end of string is not portable

a. I don't know what that means b. I would like it to not show

I tried to redirect stderr to /dev/null but it doesn't work. How do I suppress it?

  • Please edit and clarify how you use this. Are you calling it as a function? Where is $1 defined? You should also be aware that while \ are allowed in file names, it is a Very Bad Idea® to include them and it will lead to all sorts of trouble later on. – terdon Aug 6 '14 at 14:37
  • It's in a script. to run it I "sh script nameOfDirectory" – lonewarrior556 Aug 6 '14 at 14:38
  • 3
    Please edit your question to clarify accordingly. I also strongly suggest you consider using any other character but \ , backslashes are special as you're finding out. – terdon Aug 6 '14 at 14:39
3

Some expansions happen before redirection so you have to place it directly against your tr command:

touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\' 2> /dev/null)
4

The error message means that you have an unescaped backslash. In the *nix world, special characters are 'escaped' by adding a backslash before them. That means that they're interpreted as simple characters and not special ones. For example:

$ printf 'foo\nbar'
foo
bar

The \n is a special character that means newline. But if we escape the slash we get:

$ printf 'foo\\nbar'
foo\nbar

So, you can get rid of it either by escaping the backslash:

touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\\')

Or by redirecting the error output of tr (not of touch which is what you were doing):

touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\' 2> /dev/null)

However, I cannot stress enough that it is a Very Bad Idea® to create file names with backslashes. Really. They will be hell to parse and deal with later on. Why not use another character?

  • Maybe the OP from windows environment? – cuonglm Aug 6 '14 at 15:16
  • @Gnouc yes, which means it's an even worse idea to use `\`. – terdon Aug 6 '14 at 15:18
  • Git Bash in Windows 10 complains about [...] | tr '\\' '/' although the backslash is properly escaped. Go figure. – Rolf Jan 23 at 16:58
  • @Rolf Windows uses `` as the path delimiter, so that might cause issues there. – terdon Jan 23 at 17:19
2

Use single quotes with double back slash, and you will not get any error.

touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\\')
  • Fun thing is, if url=D:\Programs\Git\mingw64/share/doc/git-doc/git-log.html then ``url1=echo $url | tr '\\\ '/'``` shows the warning, while url1=$(echo $url | tr '\\' '/')` does not. – ThomasH Dec 19 '18 at 9:00

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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