我对该脚本的最终目标是:
- 循环访问文件夹
- 找出
descriptor.mod
- 将其重命名为其文件夹名称
- 将其重新定位到特定文件夹
- 重复
目前,当我尝试访问该文件夹时出现此错误
$ . a.sh
bash: cd: 'a.sh/': No such file or directory
haha
bash: cd: 'Folder 1/': No such file or directory
haha
bash: cd: 'Folder 2/': No such file or directory
haha
bash: cd: 'Folder 3/': No such file or directory
haha
bash: cd: 'Folder 4/': No such file or directory
haha
bash: cd: 'Folder 5/': No such file or directory
haha
bash: cd: 'Folder 6/': No such file or directory
haha
这是我的代码。有六个文件夹名为Folder {number}
for f in *
do
cd "'$f/'"
echo "haha"
cd ..
done
cd "E:\School\LINUX"
编辑:找到了。我改成for f in *
了for f in */
答案1
该命令cd "'$f/'"
包含外部双引号,在达到引用目的后,shell 会将其删除。内部单引号将保留下来并作为cd
参数的一部分。(有关引号内的引号的更多信息,请参见此处:参数扩展(变量扩展)和引号内的引号。
实际上你正在cd
尝试'Folder 1/'
文字单引号,而现有目标是Folder 1/
。没有'Folder 1/'
目录。
另外*
还匹配非目录。a.sh
是脚本。添加后/
和单引号,您正在尝试cd
。'a.sh/'
没有这样的目录。
cd
进入此非目录失败后,您随后还会运行cd ..
,这将带您离开起始目录并进入其父目录。从这里开始,最初*
匹配的实体不再可见,因此所有进一步的尝试也会cd
失败……事实上,每次后续失败cd
都会带您上移一个目录。
您for f in */
只需要迭代目录(但请注意*
不匹配点文件)。那么您不需要添加,/
因为尾部斜杠出现在扩展中$f
(尽管另一个尾部斜杠不会破坏任何内容)。而且您绝对不应该在参数中添加单引号cd
。相关行应该是cd "$f"
。
您可以使用如下循环来遍历所有实体,跳过非目录并cd
正确处理错误:
[ ! -d "${f}" ] && continue
跳过非目录(注意:这仍然会匹配指向目录的符号链接)cd "${f}" || continue
跳过我们无法进入的目录(例如:权限)pushd "${f}"
/popd
避免相对cd
返回尝试
for f in *; do
# skip non-directories
[ ! -d "$f" ] && continue
# skip processing for directories we can't enter (e.g: permissions)
pushd "$f" || continue
echo "hi"
pwd
popd
done