Unix如何将文件复制到目录并回显

Unix如何将文件复制到目录并回显

我正在尝试使用 for 循环编写一个脚本,将文件复制到一个目录,该目录也会将复制命令回显到终端。我已成功获取复制文件的脚本,但是在将echo每个复制命令发送到终端时遇到问题。例如,如果它将文件abc、 复制到目录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
' _ {} +

相关内容