コピーコマンドを端末にエコーするディレクトリにファイルをコピーする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
私はこれら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
' _ {} +