Search code examples
windowsbashshellcd

cd command fails when directory is extracted from windows file


I have one text file in windows that contains lots of directories that I need to extract. I tried to extract one directory and tried to cd to it in a shell script, but the cd command failed, with prompting cd: /VAR/GPIO/: No such file or directory.

I have confirmed that the directory exists in my local PC and the directory is correct (though it is relative). I have also searched a lot, seems some special windows characters exist in the extract file. I tried to see them with cat -A check and the result is ^[[m^[[K^[[m^[[KVAR/GPIO/$

I don't even know what the meaning of the m^ or [[K. Could you please help me about this problem? I use Cygwin in Windows 7 64-bit. Below is my related code for review:

templt_dir=$(cat temp | grep -m 1 "$templt_name" |head -1 | sed -n "s#$templt_name##p" | sed -n "s#\".*##p")
echo $templt_dir     ###comment, it runs output: /VAR/GPIO/, that's correct!
cd $templt_dir       ###comment, cd error prompts
cat temp | grep -m 1 "$templt_name" |head -1 | sed -n "s#$templt_name##p" | sed -n "s#\".*##p" > check  ###comment, for problem checking

Below is the content of the check file:

$ cat -A check
^[[m^[[K^[[m^[[KVAR/GPIO/$

To confirm my directory is correct, below is the results of ls -l on /VAR:

$ ls VAR -l
total 80K
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:11 Analog/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:37 Communication/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:10 GPIO/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:11 HumanInterface/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:11 Memory/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:11 PWM/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:10 Security/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:11 System/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 25 16:25 Timers/
drwxrwx---+ 1 Administrators Domain Users 0 Jun 24 11:10 UniversalDevice/

Solution

  • The error message cd: /VAR/GPIO/: No such file or directory indicates that the name stored in $templt_dir doesn’t exist.

    This is actually due to the string containing non-printing ANSI escape sequences. You need to remove these characters from the string containing the directory.

    I found the following sed substitution from this Unix and Linux answer

    sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
    

    which you should include in your pipe command:

    templt_dir=$(grep -m 1 "$templt_name" temp | sed -n "s#$templt_name##p; s#\".*##p" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")
    

    Note: I concatenated your two sed substitutions into the one command and I removed the unnecessary cat. I also removed the redundant head -1 since grep -m 1 should only output one line. You can probably combine all the sed substitutions into one: sed -r "s#$templt_name##; s#\".*##; s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" (the -n sed option and p sed command can be left out if there’s only line being processed but I can’t test this without having the original file).

    Other ways of using sed to strip ANSI escape sequences are listed at Remove color codes (special characters) with sed.

    However, a better long-term fix would be to modify the process which creates the text file listing the directories to not include ANSI Escape codes in its output.