复制文件 - 不是目录

时间:2018-01-14 15:45:34

标签: linux bash shell

为什么我不能将* .dat文件复制到另一个目录?我的部分.sh脚本是:

true

在输出中我有:( ...)不是目录。

当我在Windows上通过cygwin执行脚本但不在linux机器上执行时,此代码有效。

5 个答案:

答案 0 :(得分:3)

可能有多个问题:

  • 在第一行之后,您的工作目录为$directory。除非$directory是绝对路径,否则find会尝试搜索$directory/$directory,这可能不存在。

  • chmod返回多个文件时,
  • cpfind将无效,因为$directory仅会添加到第一个文件中。

答案 1 :(得分:3)

if可以直接复制文件:

find ... -exec

来自find "$directory" -name '*.dat' -exec cp -t "$second_dir" {} +

  

man find

     

-exec command {} +动作的这个变体运行指定的命令   选定的文件,但命令                 通过在末尾附加每个选定的文件名来构建行;调用的总数                 该命令将远远少于匹配文件的数量。

此处首选

-exec,因为如果+找到符合条件的更多文件,则该行的构建方式如下:

find

与为每个文件调用cp -t "$second_dir" file1 file2 file3 ... 的{​​{1}}变体不同。

答案 2 :(得分:0)

你不能cd "$directory"(甚至更少,引号不正确),通常你的脚本通常不需要cd任何地方。

如果chmod确实是必要的,那么普通的find -exec可能就不够了......但会稍微复杂一些。

find "$directory" -type f -name '*.dat' -exec sh -c '
    for f; do
        chmod 700 "$f"
        cp "$f" "$0"
    done' "$second_dir" {} +

换句话说,我们将找到的文件传递给一个简单的内联shell脚本。有点hackishly,我们传递目标目录为$0(通常包含脚本的名称,但它在这里没有一个)。

注意引用;文件或目录名称基本上不应该是不加引号。

答案 3 :(得分:0)

我尝试了以下命令:

dat_file=$(find "$directory" -name '*.dat' -exec cp -t "$second_directory" {} +)    

但我得到了这个信息:

cp: will not overwrite just-created `$second_dir/dat_file.dat' with `$directory/dat_file.dat'

并且脚本在此处停止。在$ directory中只有一个* .dat文件,在第二个目录中,在复制操作之前没有任何* .dat文件。 我需要一个$指针,因为这个指针是需要进一步的。

答案 4 :(得分:0)

问题解决了。在$ directory中有额外的临时目录,附加* .dat文件,find函数返回2个文件而不是1个文件。