Linux ./mv.sh:line 4:cd:1.4-1.5.csh:不是目录
我想将file1移动到当前目录的许多子目录中的directory1。file1和directory1都位于每个子目录中。我在当前目录中编写了以下脚本,但它报告“/mv.sh:line 4:cd:directory1:没有这样的文件或目录”。实际上,directory1位于每个子目录中Linux ./mv.sh:line 4:cd:1.4-1.5.csh:不是目录,linux,bash,Linux,Bash,我想将file1移动到当前目录的许多子目录中的directory1。file1和directory1都位于每个子目录中。我在当前目录中编写了以下脚本,但它报告“/mv.sh:line 4:cd:directory1:没有这样的文件或目录”。实际上,directory1位于每个子目录中 1 #!/bin/bash 2 3 for i in *; do 4 builtin cd $i 5 mv file1 directory1 6 builtin cd .. 7 done 错误
1 #!/bin/bash
2
3 for i in *; do
4 builtin cd $i
5 mv file1 directory1
6 builtin cd ..
7 done
错误
我想第6行中的
cd..
会将您带到另一个目录。您可以通过在第6行和第7行之间插入内置pwd
来检查这一点。这将显示您在cd..
之后实际所在的目录
- 也许其中一个目录实际上是指向另一个目录的链接?这可能是降落在你意想不到的地方的原因
- 如果
失败,您也可能会进入错误的目录,如果$i不是目录或您没有权限浏览它,则可能会发生这种情况cd$i
cd..
会将您带到另一个目录。您可以通过在第6行和第7行之间插入内置pwd
来检查这一点。这将显示您在cd..
之后实际所在的目录
- 也许其中一个目录实际上是指向另一个目录的链接?这可能是降落在你意想不到的地方的原因
- 如果
失败,您也可能会进入错误的目录,如果$i不是目录或您没有权限浏览它,则可能会发生这种情况cd$i
目录1
是一个悬垂的符号链接?例如:
mkdir foo
ln -s foo foolink
mv foo bar # foolink still points to foo but foo is gone!
cd foolink
# bash: cd: foolink: No such file or directory
而且,代替
cd dir
mv foo subdir
cd ..
我建议使用更简洁、更重要、更安全的版本:
mv dir/foo dir/subdir/
为什么这样更安全?假设dir
不存在:
cd dir # Fails
mv foo subdir # Oops! Now we're trying to move a file from the current directory
cd .. # Even bigger oops! Now we're even higher in the directory tree,
# and on the next iteration will be moving files around that we
# shouldn't be
(在这种特殊情况下,您也可以通过使用set-o errexit
来避免此问题,但在我看来,脚本中的cd..
通常是危险的。)
此外,正如Ansgar Wiechers所说,你应该使用
find
,而不是自己尝试爬树。有没有可能directory1
是一个悬空的符号链接?例如:
mkdir foo
ln -s foo foolink
mv foo bar # foolink still points to foo but foo is gone!
cd foolink
# bash: cd: foolink: No such file or directory
而且,代替
cd dir
mv foo subdir
cd ..
我建议使用更简洁、更重要、更安全的版本:
mv dir/foo dir/subdir/
为什么这样更安全?假设dir
不存在:
cd dir # Fails
mv foo subdir # Oops! Now we're trying to move a file from the current directory
cd .. # Even bigger oops! Now we're even higher in the directory tree,
# and on the next iteration will be moving files around that we
# shouldn't be
(在这种特殊情况下,您也可以通过使用set-o errexit
来避免此问题,但在我看来,脚本中的cd..
通常是危险的。)
此外,正如Ansgar Wiechers所说,您应该使用
find
而不是自己尝试爬树。我会使用find
而不是尝试爬树目录树:
find . -type f -name "file1" -execdir mv {} directory1/ \;
这假设每个包含文件
file1
的目录都有一个子目录directory1
我将使用find
而不是尝试爬网目录树:
find . -type f -name "file1" -execdir mv {} directory1/ \;
这假设每个包含文件
file1
的目录都有一个子目录directory1
您确定所有子目录中都有directory1
和file1
吗?我100%确定。我明白了!!!这些子目录之间有一个文件(不是目录)。我只是删除了那个文件,然后那个mv.sh脚本就可以工作了!!!这是否意味着这些目录之间不应该有文件?如果这些子目录之间有文件。cd…会把我拖到更高的目录。谢谢,伙计们!!你确定所有子目录中都有directory1
和file1
吗?我百分之百肯定。我明白了!!!这些子目录之间有一个文件(不是目录)。我只是删除了那个文件,然后那个mv.sh脚本就可以工作了!!!这是否意味着这些目录之间不应该有文件?如果这些子目录之间有文件。cd…会把我拖到更高的目录。谢谢,伙计们!!这些子目录之间有一个文件(不是目录)。我只是删除了那个文件,然后那个mv.sh脚本就可以工作了!!!如果这些子目录之间存在文件。cd…会把我拖到更高的目录。谢谢,伙计们!!光盘危险。这些子目录之间存在文件(而不是目录)。我只是删除了那个文件,然后那个mv.sh脚本就可以工作了!!!如果这些子目录之间存在文件。cd…会把我拖到更高的目录。谢谢,伙计们!!光盘这是危险的。