我可以使用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则会收到类似的错误,所以我不确定自己做错了什么...
答案 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所说,有更好的方法来完成您尝试做的事情。请阅读他们的评论