찾기를 사용하여 파일을 이동할 때 디렉터리 구조 유지

찾기를 사용하여 파일을 이동할 때 디렉터리 구조 유지

정의된 이전 파일을 소스 디렉터리에서 대상 디렉터리로 이동하기 위해 다음 스크립트를 만들었습니다. 그것은 아주 잘 작동합니다.

#!/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/maxirun 이 아닌 생성된 경로를 기반으로 대상 디렉터리를 변경해야 합니다 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"'

관련 정보