복사 명령을 터미널에 에코하는 디렉터리에 파일을 복사하는 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 루프의 결과는 다음과 같습니다.하나항목이며 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
그러나 Muru가 이미 말했듯이 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
' _ {} +