
정의된 이전 파일을 소스 디렉터리에서 대상 디렉터리로 이동하기 위해 다음 스크립트를 만들었습니다. 그것은 아주 잘 작동합니다.
#!/bin/bash
echo "Enter Your Source Directory"
read soure
echo "Enter Your Destination Directory"
read destination
echo "Enter Days"
read days
find "$soure" -type f -mtime "-$days" -exec mv {} "$destination" \;
echo "Files which were $days Days old moved from $soure to $destination"
스크립트는 파일을 잘 이동하고 소스 하위 디렉터리에서도 파일을 이동하지만 대상 디렉터리에 하위 디렉터리를 생성하지 않습니다. 이 추가 기능을 구현하고 싶습니다.
예를 들어
/home/ketan : source directory
/home/ketan/hex : source subdirectory
/home/maxi : destination directory
이 스크립트를 실행하면 16진수 파일도 maxi 디렉터리로 이동하지만 maxi 디렉터리에 동일한 16진수 파일을 생성하고 해당 파일을 프로덕션 환경에서 동일한 16진수로 이동해야 합니다.
답변1
find
지정된 것으로 알고 있지만 rsync
.
예
동일한 디렉터리 구조를 가진 이미지 파일(소스는 동일하게 유지됨):
rsync -axuv --progress Source/ Target/
동일한 디렉터리 구조로 파일을 이동합니다(소스에서 제거하고 빈 디렉터리 삭제).
rsync -axuv --prune-empty-dirs --remove-source-files --progress Source/ Target/
특정 파일 형식의 파일 이동(예):
rsync -rv --include '*/' --include '*.js' --exclude '*' --prune-empty-dirs Source/ Target/
find
고급 검색으로 생성된 파일 이동 :
cd "$source" &&
rsync -av --remove-source-files --prune-empty-dirs --progress --files-from <(find . -type f -mtime -$days) . "$destination"
파일 삭제 안내
rsync
대상 디렉터리가 소스 디렉터리를 미러링하도록 한 다음 더 이상 소스에 없는 대상의 파일(예: --delete-before
, --delete-after
, --delete-during
및 )을 삭제하는 옵션이 있습니다 --delete-delay
.
또한 대상 디렉터리(예: --remove-source-files
.
이는 사용 사례에 따라 다르므로 처리 방법은 사용자에게 달려 있습니다.
노트:Sridar Sarnobat이 지적했듯이, rsync하려는 디렉토리에 대한 심볼릭 링크가 있는 디렉토리를 rsync하면,그리고--remove-source-files`를 사용하면 데이터가 손실될 수 있습니다.
답변2
mv /home/ketan/hex/foo /home/maxi
run 이 아닌 생성된 경로를 기반으로 대상 디렉터리를 변경해야 합니다 find
. 먼저 소스 디렉터리로 변경하고 find .
. 이제 생성하는 모든 프로젝트 앞에 대상 디렉터리를 추가하기만 하면 됩니다 find
. find … -exec
연결을 수행하고 필요한 경우 대상 디렉터리를 생성하려면 명령에서 셸을 실행 해야 합니다 .
destination=$(cd -- "$destination" && pwd) # make it an absolute path
cd -- "$source" &&
find . -type f -mtime "-$days" -exec sh -c '
mkdir -p "$0/${1%/*}"
mv "$1" "$0/$1"
' "$destination" {} \;
$destination
특수 문자가 포함될 때 인용 문제를 방지하기 위해 쉘 스크립트에서 특수 문자를 바꿀 수는 없습니다. 내부 쉘에 도달하도록 환경으로 내보내거나 매개변수로 전달할 수 있습니다(제가 했던 방식입니다). 호출을 그룹화하여 실행 시간을 절약할 수 있습니다 sh
.
destination=$(cd -- "$destination" && pwd) # make it an absolute path
cd -- "$source" &&
find . -type f -mtime "-$days" -exec sh -c '
for x do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' "$destination" {} +
또는 zsh에서 다음을 사용할 수 있습니다.zmv
기능, 그리고 .
그리고m
글로벌 예선올바른 날짜 범위 내의 일반 파일만 일치시킵니다. 필요한 경우 mv
먼저 대상 디렉터리를 생성하는 대체 함수를 전달해야 합니다 .
autoload -U zmv
mkdir_mv () {
mkdir -p -- $3:h
mv -- $2 $3
}
zmv -Qw -p mkdir_mv $source/'**/*(.m-'$days')' '$destination/$1$2'
답변3
두 개의 find(1) 인스턴스를 사용하여 이 작업을 수행할 수 있습니다.
항상 cpio(1)가 있습니다.
(cd "$soure" && find … | cpio -pdVmu "$destination")
cpio의 매개변수를 확인하세요. 내가 준 것들
답변4
반환된 파일의 절대 경로를 대상 경로에 추가하면 find
됩니다 .
find "$soure" -type f -mtime "-$days" -print0 | xargs -0 -I {} sh -c '
file="{}"
destination="'"$destination"'"
mkdir -p "$destination/${file%/*}"
mv "$file" "$destination/$file"'