2011-11-26 4 views
3

저는 그래픽 회사에서 일하고 있으며 고객이 엄청난 양의 데이터를 제출합니다. 단일 프로젝트 폴더는 서버에서 수백 기가 바이트의 공간을 차지할 수 있습니다. 직접 연결된 RAID의 공간은 10TB로 제한되어 있지만 iSCSI를 통해 메인 서버에 연결된 96TB 스토리지 서버가 있습니다.find 명령을 사용한 Rsync, 원본 삭제, 심볼 링크로 원본 바꾸기

나는이 과정을 자동화 할 수 BASH 스크립트에 충분히 익숙하지만 내가 수동으로 할 것은이 명령을 찾아내는 수행하지 해요 :

find /disk -type d -name 09\ Client-Files | sed 's/ /\\ /g' > client-origs.txt 

나는 "09 클라이언트 파일"rsync는이 목록에서 디렉토리를 사용하여 스토리지 서버에 연결하십시오 :

rsync -avR /disk/Client-Jobs/1234\ Client/09\ Client-Files /iscsi 

-R 옵션을 사용하면/iscsi에 대한 상대 경로가 복사됩니다.

원래의 "09 Client-Files"디렉토리가 삭제되고 심볼릭 링크가/iscsi 볼륨의 새 위치를 가리 킵니다.

내가 뭘 쏘고있는 것은 모든 것을 한 번에 할 수있는 변수로 발견 된 경로를 사용하는 것입니다. 계속 진행하는 방법에 대한 손실이 있습니다. 지금 당장 bash 변수에 대해 배워 보려고 노력했습니다. 더 간단한 작업을 할 수는 있지만이 경우에는 비어 있습니다. 형제를 도울 수 있습니까?

답변

1

lndir 명령을 보았습니까? (별도로 설치해야 할 수도 있음)

다른 디렉토리 트리를 가리키는 심볼릭 링크의 섀도우 디렉토리를 만듭니다.

0

당신이 발견 한 번에 모든 작업을 수행 할 수 있습니다

find /usr -type d -name My\ Files -exec rsync -avR '{}' /iscsi \; 

더 많은 정보 man find를 들어, 몇 가지 예제가 바로 끝나기 전에. 또는 xargs 유틸리티를 사용하여 결과를 파이프 할 수도 있습니다.

매뉴얼을 자세히 살펴보고 보물을 찾아야합니다. bash는 스크립트에

당신은 또한 둘 수 있었다 :

export MIVARIABLE=$(find /usr -type d -name My\ files) 

다음

for i in $MIVARIABLE ;do 
    rsync -avR $i /iscsi; 
done 

을하지만이 결과가 매우 큰 경우에 그 (것)들의 사이에서 단점이있다, 그것은 bash는 최대 텍스트 공간을 사용할 수를 초과 할 수 검색된 이름에 공백이 포함되면 일부 유틸리티가 미쳐 버릴 수 있습니다.

현대 시스템에서 bash 환경 변수의 최대 크기는 8kib에서 2MiB 정도가 될 수 있습니다. 변수에 대한 많은 정보를 입력하면 Argument list too long 오류가 발생합니다.

따라서 파일/디렉토리 목록을 반복 할 필요가있는 경우 기본 제공 기능을 사용하거나 xargs과 협력하여 사용하십시오. 신중하게 자신의 설명서를 읽고 대신에 echo your_command_line을 사용하여 일부 드라이 런을 시도하십시오. 따라서 유틸리티에 대해 적절한 경험과 확신을 얻으실 수 있습니다. find-print0 기능과 의 -0 명령은 파일 이름에 공백과 기호가있는 일부 문제를 방지하도록 설계되었습니다.

편집 : find는 간부 운영자 제대로 공백을 처리합니다 :

find /usr -type d -name My\ Files -exec rsync -avR '{}' /iscsi \; -exec rm -rf '{}'\; 

당신이 하나씩 필요 할 것이다. 옵션을 지적하고 있었기 때문에 귀하의 필요에 더 잘 맞는 것이 무엇인지 결정할 수있었습니다. 나는 당신을 혼란스럽게 할 의도가 없었습니다.

Edit2가 :

find /usr -type d -name 'My Files' -exec rsync -avR '{}' /iscsi \; -exec rm -rf '{}'\; 

funciona의 igual의 케 엘 ejemplo 드 아리바. Cuando bash lee 'My Files'는 전체 단어를 교환하고 다르게 내부의 공백을 처리하지 않습니다.

+0

RedComet 제안에 감사드립니다. 귀하의 게시물은 매우 도움이되었습니다. 루프에'rm -r $ i;'와'ln -s/iscsi/$ i $ i;'를 추가했습니다. 디렉토리는 공백을 포함하고 스크립트는 인수를 구문 분석하지 않습니다. 공백을 피하기 위해 sed에 변수를 파이프하더라도. 테스트 디렉토리에 공백이 없으면 제대로 작동합니다. 아이디어? –

+0

@Flex Branningan : 귀하의 의견을 회신하도록 편집했습니다. – RedComet

+0

이 작업은 가능하지만 find 명령에 세 번째 옵션을 추가하여 원래 상위 디렉토리로 심볼릭 링크하면 첫 번째 옵션을 수행하지만 후속 옵션은 수행하지 않습니다. 'find/disk -type d -name "09 클라이언트"-exec rsync -avR {}/iscsi \; -exec rm -r {} \; -exec ln -s/iscsi {} {} \; –