为什么我不能将* .dat文件复制到另一个目录?我的部分.sh脚本是:
true
在输出中我有:( ...)不是目录。
当我在Windows上通过cygwin执行脚本但不在linux机器上执行时,此代码有效。
答案 0 :(得分:3)
可能有多个问题:
在第一行之后,您的工作目录为$directory
。除非$directory
是绝对路径,否则find
会尝试搜索$directory/$directory
,这可能不存在。
chmod
返回多个文件时, cp
和find
将无效,因为$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个文件。