현재 하위 디렉터리가 미리 생성되었다고 가정하고 현재 디렉터리의 모든 내용을 하위 디렉터리에 복사하는 다음 명령이 있습니다.
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/"
.)
작은 함수나 스크립트로 만들 수 없는 이유가 없으므로 여전히 명령일 뿐입니다.