bash 中如何使用字符串路径?
How are string paths used in bash?
上下文:我想将一个 Android 项目迁移到 AndroidX。 Android Studio 中有一个工具可以自动执行此操作,但效果不是很好。 并且我找到了一个脚本,用一个文本文件替换项目中的所有引用以映射它们。
我想在 Windows 中 运行 一个 bash 脚本。我正在使用 Ubuntu TLS,并在 Windows 中启用了 属性 配置。脚本是:
MAPPING_FILE=C:\Users\name\Desktop\androidx-class-mapping.csv
PROJECT_DIR=C:\Proyectos\Proyecto STH trunk
replace=""
while IFS=, read -r from to
do
replace+="; s/$from/$to/g"
done <<< "$(cat $MAPPING_FILE)"
find $PROJECT_DIR \( -name "*.kt" -o -name "*.java" -o -name "*.xml" \) -type f -not -path '*/\.git*' -print0 | xargs -0 gsed -i "$replace"
当我 运行 bash 中的脚本时,我得到:
./script.sh: line 15: STH: command not found
cat: 'C:/Users/aperez/Desktop/androidx-class-mapping.csv': No such file or directory
xargs: gsed: No such file or directory
我不是很喜欢 Linux 系统,但我记得一些关于带空格的字符串。我试过在路径上加上引号 ("C:\...") 以避免将其解释为命令,但没有用。关于第二行错误:该文件确实存在于该路径中。我无法识别第三个错误。
我在 bash 中搜索了字符串的用法,但我无法让它工作,我将不胜感激!
第一个错误:double-quote参数扩展以避免在空格处分词:
find "$PROJECT_DIR" ...
第二个错误:我很惊讶你得到这个错误。应该是:
cat: 'C:UsersaperezDesktopandroidx-class-mapping.csv': No such file or directory
因为您的 MAPPING_FILE
作业中的反斜杠应该被丢弃。使用 single-quotes 保留反斜杠:
MAPPING_FILE='C:\Users\name\Desktop\androidx-class-mapping.csv'
同样适用于PROJECT_DIR
赋值; single-quote它:
PROJECT_DIR='C:\Proyectos\Proyecto STH trunk'
并将done <<< "$(cat $MAPPING_FILE)"
替换为done < "$MAPPING_FILE"
。使用 cat 将文件内容重定向到另一个命令通常是 anti-pattern.
第三个错误:gsed
没有安装,或者它的名字不是gsed
而是sed
,或者它的目录不在你的PATH
中。安装 gsed
(或 sed
)如果尚未安装,请设置您的 PATH
环境变量,并使用正确的命令名称:
$ export PATH=$PATH:/path/to/gsed-or-sed/directory
$ (g)sed --version
我还有一个 Linux 的 Windows 子系统,两者之间的 link 是使用 Linux 挂载点创建的,您可以从以下命令中看到:
WSL Prompt>/mnt/c/Temp_Folder/a$ df -k
Filesystem 1K-blocks Used Available Use% Mounted on
...
C:\ 999036924 491402636 507634288 50% /mnt/c
WSL Prompt>/mnt/c/Temp_Folder/a$ sudo mount -v
...
C:\ on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,case=off)
因此,如果您想在您的计算机上工作,基于您的 WSL,您可能需要将 C:\
替换为 /mnt/c/
(并且不要忘记使用斜杠而不是反斜杠) .
上下文:我想将一个 Android 项目迁移到 AndroidX。 Android Studio 中有一个工具可以自动执行此操作,但效果不是很好。
我想在 Windows 中 运行 一个 bash 脚本。我正在使用 Ubuntu TLS,并在 Windows 中启用了 属性 配置。脚本是:
MAPPING_FILE=C:\Users\name\Desktop\androidx-class-mapping.csv
PROJECT_DIR=C:\Proyectos\Proyecto STH trunk
replace=""
while IFS=, read -r from to
do
replace+="; s/$from/$to/g"
done <<< "$(cat $MAPPING_FILE)"
find $PROJECT_DIR \( -name "*.kt" -o -name "*.java" -o -name "*.xml" \) -type f -not -path '*/\.git*' -print0 | xargs -0 gsed -i "$replace"
当我 运行 bash 中的脚本时,我得到:
./script.sh: line 15: STH: command not found
cat: 'C:/Users/aperez/Desktop/androidx-class-mapping.csv': No such file or directory
xargs: gsed: No such file or directory
我不是很喜欢 Linux 系统,但我记得一些关于带空格的字符串。我试过在路径上加上引号 ("C:\...") 以避免将其解释为命令,但没有用。关于第二行错误:该文件确实存在于该路径中。我无法识别第三个错误。 我在 bash 中搜索了字符串的用法,但我无法让它工作,我将不胜感激!
第一个错误:double-quote参数扩展以避免在空格处分词:
find "$PROJECT_DIR" ...
第二个错误:我很惊讶你得到这个错误。应该是:
cat: 'C:UsersaperezDesktopandroidx-class-mapping.csv': No such file or directory
因为您的 MAPPING_FILE
作业中的反斜杠应该被丢弃。使用 single-quotes 保留反斜杠:
MAPPING_FILE='C:\Users\name\Desktop\androidx-class-mapping.csv'
同样适用于PROJECT_DIR
赋值; single-quote它:
PROJECT_DIR='C:\Proyectos\Proyecto STH trunk'
并将done <<< "$(cat $MAPPING_FILE)"
替换为done < "$MAPPING_FILE"
。使用 cat 将文件内容重定向到另一个命令通常是 anti-pattern.
第三个错误:gsed
没有安装,或者它的名字不是gsed
而是sed
,或者它的目录不在你的PATH
中。安装 gsed
(或 sed
)如果尚未安装,请设置您的 PATH
环境变量,并使用正确的命令名称:
$ export PATH=$PATH:/path/to/gsed-or-sed/directory
$ (g)sed --version
我还有一个 Linux 的 Windows 子系统,两者之间的 link 是使用 Linux 挂载点创建的,您可以从以下命令中看到:
WSL Prompt>/mnt/c/Temp_Folder/a$ df -k
Filesystem 1K-blocks Used Available Use% Mounted on
...
C:\ 999036924 491402636 507634288 50% /mnt/c
WSL Prompt>/mnt/c/Temp_Folder/a$ sudo mount -v
...
C:\ on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,case=off)
因此,如果您想在您的计算机上工作,基于您的 WSL,您可能需要将 C:\
替换为 /mnt/c/
(并且不要忘记使用斜杠而不是反斜杠) .