Unixファイルをディレクトリにコピーしてエコーする方法

Unixファイルをディレクトリにコピーしてエコーする方法

コピーコマンドを端末にエコーするディレクトリにファイルをコピーするforループを使用してスクリプトを作成しようとしています。ファイルをコピーするスクリプトが正常に取得されましたが、echo各コピーコマンドを端末に送信する際に問題があります。たとえば、ファイルa、、、bcディレクトリにコピーする場合は、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

私はこれら2つのコメント行を試しましたが、どちらも期待した結果を得ませんでした。どんな助けでも大変感謝します。

答え1

forループの結果は次のとおりです。一つこれはエントリであり、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ファイルディレクトリを含めるかどうかを知らなかったので、いくつかの代替ソリューションを提供します。

1. シングルレベルファイルディレクトリ

#!/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
' _ {} +

関連情報