从 windows 文件中提取目录时 cd 命令失败
cd command fails when directory is extracted from windows file
我在 windows 中有一个文本文件,其中包含许多我需要提取的目录。
我试图提取一个目录并尝试在 shell 脚本中 cd
到它,但是 cd
命令失败,并提示 cd: /VAR/GPIO/: No such file or directory
.
我已确认该目录存在于我的本地 PC 中并且该目录是正确的(尽管它是相对的)。我也搜索了很多,提取文件中似乎存在一些特殊的 windows 字符。我试着用 cat -A check
查看它们,结果是 ^[[m^[[K^[[m^[[KVAR/GPIO/$
我什至不知道m^
或[[K
是什么意思。
你能帮我解决这个问题吗?我在 Windows 7 64 位中使用 Cygwin。
下面是我的相关代码供审核:
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
以下是 check
文件的内容:
$ cat -A check
^[[m^[[K^[[m^[[KVAR/GPIO/$
为了确认我的目录是正确的,下面是 ls -l
在 /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/
错误信息cd: /VAR/GPIO/: No such file or directory
表示
$templt_dir
中存储的名称不存在。
这实际上是由于字符串包含非打印ANSI转义
序列。
您需要从包含目录的字符串中删除这些字符。
中找到了以下 sed 替换
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
你应该在你的管道命令中包含:
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")
注意: 我将你的两个 sed
替换连接到一个命令中,我删除了不必要的 cat
。我还删除了多余的 head -1
因为 grep -m 1
应该只输出一行。您可以将所有 sed 替换合并为一个:sed -r "s#$templt_name##; s#\".*##; s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
(如果只处理行,则可以省略 -n
sed 选项和 p
sed 命令,但我无法测试它没有原始文件)。
使用 sed
去除 ANSI 转义序列的其他方法列于 Remove color codes (special characters) with sed。
但是,更好的长期解决方法是修改创建列出目录的文本文件的过程,使其输出中不包含 ANSI 转义码。
我在 windows 中有一个文本文件,其中包含许多我需要提取的目录。
我试图提取一个目录并尝试在 shell 脚本中 cd
到它,但是 cd
命令失败,并提示 cd: /VAR/GPIO/: No such file or directory
.
我已确认该目录存在于我的本地 PC 中并且该目录是正确的(尽管它是相对的)。我也搜索了很多,提取文件中似乎存在一些特殊的 windows 字符。我试着用 cat -A check
查看它们,结果是 ^[[m^[[K^[[m^[[KVAR/GPIO/$
我什至不知道m^
或[[K
是什么意思。
你能帮我解决这个问题吗?我在 Windows 7 64 位中使用 Cygwin。
下面是我的相关代码供审核:
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
以下是 check
文件的内容:
$ cat -A check
^[[m^[[K^[[m^[[KVAR/GPIO/$
为了确认我的目录是正确的,下面是 ls -l
在 /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/
错误信息cd: /VAR/GPIO/: No such file or directory
表示
$templt_dir
中存储的名称不存在。
这实际上是由于字符串包含非打印ANSI转义 序列。 您需要从包含目录的字符串中删除这些字符。
中找到了以下 sed 替换sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
你应该在你的管道命令中包含:
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")
注意: 我将你的两个 sed
替换连接到一个命令中,我删除了不必要的 cat
。我还删除了多余的 head -1
因为 grep -m 1
应该只输出一行。您可以将所有 sed 替换合并为一个:sed -r "s#$templt_name##; s#\".*##; s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
(如果只处理行,则可以省略 -n
sed 选项和 p
sed 命令,但我无法测试它没有原始文件)。
使用 sed
去除 ANSI 转义序列的其他方法列于 Remove color codes (special characters) with sed。
但是,更好的长期解决方法是修改创建列出目录的文本文件的过程,使其输出中不包含 ANSI 转义码。