我正在尝试使用 for 循环编写一个脚本,将文件复制到一个目录,该目录也会将复制命令回显到终端。我已成功获取复制文件的脚本,但是在将echo
每个复制命令发送到终端时遇到问题。例如,如果它将文件a
、b
、c
、 复制到目录2
,我希望它每次复制文件时都说path/file copied to /path/path/directory
。
这是我到目前为止所拥有的:
for i in /Users/ashleyschumann/Pictures
do
cp -r ./Pictures ./BACKUP_FILES2
#echo "filename copied to BACKUP_FILES2"
#echo "$fn copied to $ashleyschumann/BACKUP_FILES2"
done
我都尝试过这两条注释行,但都没有得到预期的结果。任何帮助,将不胜感激。
答案1
你的 for 循环只会导致一item 并且它不会在您的 cp 命令中使用。它可能看起来像这样:
BACKUP_DIR="/Users/ashleyschumann/BACKUP_FILES2/"
for item in /Users/ashleyschumann/Pictures/*
do
cp -r $item ./BACKUP_FILES2
echo "$item copied to $BACKUP_DIR"
done
但正如穆鲁已经说过的那样,cp -v
他会这样做。
答案2
最简单的方法是在复制命令上启用详细模式
cp -av Pictures BACKUP_FILES2/
或者
rsync -av Pictures BACKUP_FILES2/
如果您想自定义消息,您需要遍历文件。由于您没有告诉我们是否Pictures
包含文件目录,因此我将提供一些替代解决方案。
一、文件的单级目录
#!/bin/bash
# Backup files from a single level directory
target=BACKUP_FILES2/Pictures
# ensure target exists
mkdir -p "$target"
# here we go
for pic in Pictures/*
do
if [[ -f "$pic" ]]
then
# it's a file
cp -p "$pic" "$target/" &&
echo "Copied $pic" >&2
fi
done
接下来是文件目录树的几个选项。
#!/bin/bash
# Backup a tree of files using cp and a customised message
target=BACKUP_FILES2
find Pictures -exec bash -c '
for i in "$@"
do
if [[ -d "$i" ]]
then
mkdir -p "/tmp/target/$i" && echo "Created directory $i" >&2
else
cp -p "$i" /tmp/target/"$i" && echo "Copied $i" >&2
fi
done
' _ {} +
或者
#!/bin/bash
# Backup a tree of files using rsync and a customised message
target=BACKUP_FILES2
find Pictures -type f -exec bash -c '
for i in "$@"
do
rsync -aqR --no-r "$i" "$target" && echo "Copied $i" >&2
done
' _ {} +