将变量传递给cp / mv

时间:2019-07-08 12:02:10

标签: bash

我可以使用cp或mv命令手动将文件复制/ mv到新文件夹,但是在for循环中,它将失败。

我尝试了多种方法来完成此操作,但似乎没有一种有效。最令人沮丧的是,它在本地运行时有效。

我正在尝试做的一个简单版本如下所示:

#!bin/bash

#Define path variables
source_dir=/home/me/loop
destination_dir=/home/me/loop/new

#Change working dir
cd "$source_dir"

#Step through source_dir for each .txt. file
for f in *.txt
  do
    # If the txt file was modified within the last 300 minutes...
    if [[ $(find "$f" -mmin -300) ]]
    then
    # Add breaks for any spaces in filenames
    f="${f// /\\ }"
    # Copy file to destination
    cp "$source_dir/$f $destination_dir/"
    fi
  done

错误消息是:

cp: missing destination file operand after '/home/me/loop/first\ second.txt /home/me/loop/new/'
Try 'cp --help' for more information.

但是,我可以手动运行:

mv /home/me/loop/first\ second.txt /home/me/loop/new/

,效果很好。 我使用cp会收到相同的错误,而使用rsync则会收到类似的错误,所以我不确定自己做错了什么...

2 个答案:

答案 0 :(得分:2)

cp "$source_dir/$f $destination_dir/"

当两个参数都用双引号引起来时,会将它们转换为一个带有嵌入式空格的参数。分别引用它们。

cp "$source_dir/$f" "$destination_dir/"

对于空格,没有任何特殊的事。引用已经确保带有空格的文件得到正确处理。

# Add breaks for any spaces in filenames
f="${f// /\\ }"

让我们退后一步。遍历所有*.txt文件,然后用find检查每个文件过于复杂。 find已经循环遍历多个文件,并对这些文件执行任意操作。您可以通过单个find命令来执行此脚本中的所有操作。

#!bin/bash

source_dir=/home/me/loop
destination_dir=/home/me/loop/new

find "$source_dir" -name '*.txt' -mmin -300 -exec cp -t "$destination_dir" {} +

答案 1 :(得分:1)

您需要将其分成两个字符串,如下所示:

cp "$source_dir/$f" "$destination_dir/"

基本上,您要告诉cp整行是第一个参数,实际上它是两个(源和目标)。

编辑:正如@ kamil-cuk和@aaron所说,有更好的方法来完成您尝试做的事情。请阅读他们的评论