현재 디렉터리의 모든 항목을 현재 디렉터리 아래의 하위 디렉터리에 백업하거나, 하위 디렉터리가 없으면 새로 만듭니다.

현재 디렉터리의 모든 항목을 현재 디렉터리 아래의 하위 디렉터리에 백업하거나, 하위 디렉터리가 없으면 새로 만듭니다.

현재 하위 디렉터리가 미리 생성되었다고 가정하고 현재 디렉터리의 모든 내용을 하위 디렉터리에 복사하는 다음 명령이 있습니다.

cp -p !($PWD/bakfiles2) bakfiles2/

하지만 때로는 이전에 액세스한 적이 없는 폴더에 액세스해야 하므로 "bakfiles2" 하위 디렉터리가 없을 수도 있습니다. 어떻게든 현재 타임스탬프를 사용하여 백업 디렉터리를 생성할 수 있습니다(기존 디렉터리와의 충돌을 피하기 위해). 단일 복사 명령이나 bash 스크립트를 사용합니까?

스크립트가 특정 패턴으로 시작하는 모든 하위 디렉터리를 무시하고 디렉터리 이름에 대해 해당 패턴을 유지할 수 있다면 backup좋을 것입니다 _bak_*(노트:*는 임의의 문자 수를 의미합니다).

답변1

cp이 명령에는 처리 시 대상 디렉터리가 없는 경우 대상 디렉터리를 생성하는 옵션이 없지만 스크립트를 통해 이를 수행할 수 있습니다.

rsync또는 마지막 수준에만 대상 디렉토리가 존재하지 않는 경우 대상 디렉토리를 생성할 수 있는 명령을 사용하십시오 .

rsync -rv --exclude='_bak_*/' /path/in/source/ /path/to/destination
  • 가져오기를 수행하면 /소스 /path/in/source/디렉터리 자체가 복사되는 것을 방지하고 --exclude디렉터리를 일치하는 이름과 동기화하지 않는 옵션이 추가됩니다.

답변2

date다음 명령을 사용하여 현재 타임스탬프를 가져올 수 있습니다.

date +'%Y%m%d_%H%M%S'

재귀 복사를 사용하지 않는 한 디렉터리의 내용을 이미 존재하는 디렉터리에만 복사할 수 있습니다. 그러나 이전 백업 디렉터리를 새 백업 디렉터리에도 복사하려는 경우가 아니면 재귀 복사를 사용할 수 없습니다.

따라서 이 작업은 몇 단계를 거쳐 완료되어야 합니다.

backup_dir="_bak_$(date +'%Y%m%d_%H%M%S')"
mkdir "$backup_dir"
cp -p !(_bak_*) "$backup_dir/"

작성된 대로 도트 파일(문자로 시작하는 파일)은 복사되지 않는다는 점을 명심하세요. .이러한 파일은 일반적으로 쉘에서 특별히 처리되기 때문입니다. (이 기능을 활용 .bak_*하려면 대신 백업 디렉터리 이름을 지정하는 것이 좋습니다 _bak_*. 그러면 가능합니다 cp -p * "$backup_dir/".)

작은 함수나 스크립트로 만들 수 없는 이유가 없으므로 여전히 명령일 뿐입니다.

관련 정보