..
수백 또는 수천 개의 파일이 있을 수 있는 디렉토리로 파일을 어떻게 이동합니까 ? 어떤 방법을 사용할지 확신할 수 없습니다 .
스푸핑을 처리하는 방법은 다양하며, 스푸핑을 무시하는 경우도 있고 보안을 강화해야 하는 경우도 있습니다. IO는 프로덕션 서버이므로 중요할 수 있습니다. 그러나 주어진 숫자가 주어지면 중복되지 않은 파일을 묻는 옵션이 없습니다. 권한과 타임스탬프 등을 보존하는 것이 중요합니다. 우리는 데이터가 무엇인지 모르는 경우가 많습니다.
아, mv
필수는 아닙니다 rsync
. cp
솔루션을 환영합니다.
참고: CentOS 5.5를 실행 중이므로 최신 버전이므로 해당 버전에서 작동하지 않으면 알려 주시기 바랍니다.
답변1
부모의 rsync를 사용하는 것이 좋습니다.
rsync -avPr -b --suffix='-original' child/* .
이렇게 하면 상위 파일의 기존 중복 파일이 모두 백업됩니다.문서-원래.
답변2
cp -bal . ..
이는 현재 디렉토리의 모든 것을 그 위의 디렉토리로 복사하고 모든 권한을 유지하며 가능하면 하드 링크를 사용하여 IO를 최소화하고 중복 파일 이름을 생성합니다 ~
이후
rm -rf . ; cd .. ; rmdir <originaldir>;
답변3
이 예에서는 파일이 "/parent/old-dir"에서 "/parent"로 이동됩니다.
cd /parent
rsync -av --progress old-dir/ .
rm -rf old-dir
rsync 규칙에 따라 old-dir
.
답변4
mv -i
대상이 존재하는 경우에만 메시지가 표시됩니다.
yes n | mv -i …
대상 디렉터리에 존재하지 않는 모든 파일을 이동합니다. FreeBSD와 OSX에서는 이것을 mv -n …
.
이들 중 어느 것도 대상 디렉토리에 있는 동일한 이름의 기존 디렉토리와 디렉토리 매개변수를 병합하지 않습니다.
또 다른 질문은 현재 디렉터리의 모든 파일에 대해 작업하는 방법입니다. 두 가지 문제가 있습니다. 모든 파일을 가져오는 것( *
점 파일 생략)과 명령줄로 실행되지 않는 것입니다. Linux(또는 보다 일반적으로 GNU find 및 GNU coreutils 사용):
find . -mindepth 1 -maxdepth 1 -exec mv -i -t .. -- {} +
GNU find를 사용하고 GNU coreutils(또는 이전 GNU coreutils)는 사용하지 마십시오.
find . -mindepth 1 -maxdepth 1 -exec sh -c 'mv -i -- "$@" "$0"' .. {} +
가지고 다닐 수 있는:
find . -name . -o -exec sh -c 'mv -i -- "$@" "$0"' .. {} -type d -prune
늘 그렇듯이 zsh를 사용하면 작업이 더 쉬워집니다. 내부적으로는 명령줄 길이 제한이 없으므로 mv
내장 명령을 사용하는 경우 이에 대해 걱정할 필요가 없습니다. glob 한정자를 사용하여 도트 파일을 무시하지 않도록 지시할 수 있습니다 D
. 제한 사항: 이는 파일 시스템 전체에서 작동하지 않습니다(zsh 4.3.10 기준).
zmodload zsh/files
mv -i -- *(D) ..