2014-11-22 14 views
1

좋아, 우분투를 처음 사용합니다. 30 일 이내에 업데이트되지 않은 파일을 보관하고 보관해야하는 200,000 개의 파일이 있습니다.복사 및 삭제

find . -type f -mtime +30 

완료.

그렇다면 현재 디렉토리 구조를 유지하면서 위치에 파일을 복사해야합니다. 이것은 파일 구조가 각 파일의 고유성의 일부이기 때문에 가능합니다. sum이라는 파일이 200 개있을 수 있지만 FunRun/Sum과 Smoke/Sum은 서로 다른 두 가지입니다.

find . -type f -mtime +30 -exec cp --parents '{}' /home/me/backup \; 

완료. 하지만 그것들은 삭제되지 않습니다 ... 음 mv는 삭제가있는 cp입니다. 그러나 MV에는 - 부모 전환이 없습니다.

그래서 나는
find . -type f -mtime +30 -exec cp --parents '{}' /home/me/backup \; && rm 
for file in 'find . -type f -mtime +30' do sudo cp $file --parents '{}' /home/me/backup \; && sudo rm $file; done 

없음 이동

을 시도했다. 그래서 나는 파일 목록을 만들고 오래된 학교 배치 파일처럼 사용하고 있었다. 문제는 목록을 만드는 데 오랜 시간이 걸리므로이 과정을 자동화하고 싶습니다. 그래서 나는 수색 한 아무것도 작동 한 아무것도 시험하지 않았다. 따라서 한 줄짜리 bash 스크립트는 잃어버린 원인이며 파이썬 스크립트를 작성해야합니다. 그렇지 않으면 여러분이 도울 수 있습니다. 그래서 나는 여기서 물어볼 것이고 그것이 주말에 어떻게 이루어지고 월요일에 시험되는지 보았습니다.

도움 주셔서 감사합니다.

+0

마지막 두 개의 명령을 "그래서 시도"인가요? 첫 번째 문장에서 'rm'에 대한 논의는 어디서 시작될 것으로 예상됩니까? 왜 당신은 두 번째 것에'sudo'를 추가 했습니까? 'for'에';'또는 개행 문자는 어디에 있습니까? ''{} '이 두 번째 줄에서 오는 것을 어디에서 기대할 수 있으며,'$ file'을 이미 가지고 있다면 왜 거기에서 원하는 것이 있습니까? (또한, 아무데도 따옴표가없는 이유는 무엇입니까?) – abarnert

+0

예, 두 개의 별도 명령이었습니다. 주위를 복사하려고 할 때 루트 수준 액세스 오류가 필요하기 때문에 sudo를 추가했습니다. 남은만큼 배우려고 노력 중이며 테스트 서버에서 작동하도록 노력하고 있습니다. – user1519219

답변

1

당신이하는 일 중 대부분은 샷건 디버깅 시도처럼 보입니다. 단지 그들이 의미하는 것을 알지 못하고 무작위로 변경합니다. find에 관한 튜토리얼과 bash 스크립팅에 관한 튜토리얼을 읽어야한다.


어쨌든 하나의 find 명령에 여러 작업을 함께 입력 할 수 있습니다. 원하는 경우 복수 -exec 작업. 그래서 :

find . -type f -mtime +30 -exec cp --parents '{}' /home/me/backup \; -exec rm '{}' \; 

또는, 더 간단하게 :

find . -type f -mtime +30 -exec cp --parents '{}' /home/me/backup \; -delete 

또는 물론, 당신은 모든과 rm를 호출, 모든 인수와 cp --parents를 호출 자신의 두 줄 셸 스크립트를 작성할 수 하지만 그 마지막 논쟁은 단지 -exec입니다.


당신이 for 루프를하고 싶은 경우에, 당신은 그렇게 할 수 ... xargs 아마 하나씩하는 것보다 감각으로 만들 것입니다하지만, 이제 사용자가 원하는 방식으로 해보자 : 당신은

  • find을 전혀 호출하지 않습니다. 작은 따옴표는 리터럴 문자열을 표시합니다. 문자열을 명령으로 실행하여 결과를 얻으려는 경우 의 백틱이 필요합니다. 또는 $(…).
  • 한 줄의 for 루프는 do 앞에 세미콜론이 필요합니다.
  • find 명령에 포함되어 있지 않은 sudo을 추가 했으므로 여기서도 원하지는 않습니다.
  • $file을 따옴표없이 사용하면 이름에 공백이있는 파일이 있으면 좋지 않은 생각입니다.
  • '{}'\;{}; 문자열을 cp으로 전달합니다. 따라서 $file, {}/home/me/backup;으로 복사하시는 것이 좋습니다. 그건 말이 안되요. find 명령에는 이러한 용도에 대한 특수 용도가 있지만 cp 명령에는 사용되지 않습니다. 파일 이름을 전달하기 위해 '{}'을 사용하는 경우 이미 $file을 사용하고 있습니다.

그래서 :

for file in $(find . -type f -mtime +30); do cp "$file" --parents /home/me/backup && sudo rm "$file"; done 
+0

예, 저는 우분투와 배시 초심자입니다. Windows에서 10 년, 우분투에서 약 2 일입니다. 나는 내가했던 것처럼 내가 얻은 방법 인 튜토리얼을 읽었다. 정말 좋은 bash 스크립트 튜토리얼을 추천 해 주시겠습니까? 당신이 방금 배울 때 어떤 것이 좋은지 나쁜지를 결코 알지 마십시오. 오늘 나는 이것을 시험해보고 알려 드리겠습니다. =) 지금까지 시간 내 주셔서 감사합니다. – user1519219

+0

@ user1519219 : 좋은 생각이 아닙니다. sh/ksh 사용자를위한 튜토리얼에서 bash를 배웠다. 그리고 나는 그것이 아주 좋은 것이라고 생각하지 않는다. 수십 년 후, bash가 더 나은 솔루션을 제공 할 때조차도 여전히 까다로운 ksh 방식으로 작업을 수행합니다. :) Google이 충분하지 않다면 Unix/Linux/Ubuntu 메일 링리스트 또는 포럼에 대한 질문을 시도해보십시오. – abarnert

+0

첫 번째 스크립트를 실행했습니다. 나는 cp에 sudo를 추가하고 삭제해야했다. 그러나 그것은 나의 dev 박스에서 작동했다. 나는 나중에 생산에 그것을 나중에 시험 할 예정이다. 고맙습니다 복사 한 파일의 수정 날짜를 유지하는 방법이 있습니까? – user1519219