0

我想将 file1 移动到当前目录的许多子目录中的 directory1。file1 和 directory1 都在每个子目录中。我在当前目录中编写了以下脚本,但它报告“./mv.sh: line 4: cd: directory1: No such file or directory”。实际上,directory1 在每个子目录中。

1 #!/bin/bash
2
3 for i in *; do
4    builtin cd $i
5    mv file1 directory1
6    builtin cd ..
7 done

错误

./mv.sh: line 4: cd: directory1: No such file or directory
mv: cannot stat `file1': No such file or directory
4

3 回答 3

2

这可能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而不是尝试自己爬树。

于 2013-08-12T17:25:00.543 回答
1

我会使用find而不是尝试爬取目录树:

find . -type f -name "file1" -execdir mv {} directory1/ \;

这假定每个带有文件file1的目录都有一个子目录directory1

于 2013-08-12T17:25:06.567 回答
0

我想第cd ..6 行将您带到另一个目录。您可以通过在第 6 行和第 7 行之间插入来检查这一点builtin pwd。这会显示您在cd ...

  • 也许其中一个目录实际上是指向另一个目录的链接?这可能是降落在您没想到的地方的原因。
  • 如果cd $i失败,您也可能会进入错误的目录,如果 $i 不是目录或您无权浏览它,则可能会发生这种情况。
于 2013-08-12T17:20:47.010 回答