2016-07-01 3 views
1

내가 형식으로 파일의 수백을 포함하는 중첩 된 폴더 계층 구조를 가지고 짝수의 끝 폴더에서 파일을 삭제하려면 [AZ]. [0-9] .h5bash는 스크립트가 반복적으로

는 [AZ]는 어디에서 할 수 있습니다 임의의 길이의 영숫자, [0-9]는 임의의 자릿수가 될 수 있지만 항상 숫자이며 확장자는 h5로 고정됩니다.

  • model1_weights.1.h5
  • model354_weights.64.h5

등 나는에도 모든 파일을 삭제할

공간을 절약하기 위해

예를 들어, 이 남아 :

  • model1_weights.1.h5
  • model1_weights.37.h5
  • model1_weights.185.h5

하지만 이러한

  • model1_weights.0.h5 이동
  • model1_weights.32.h5
  • model1_weights.184.h5

나는 파이썬에서 이것을 수행하고, 모든 디렉토리를 탐색하고, 점으로 나누고, 확인하고, 삭제하는 방법을 알고있다. 그러나 이것이 rm -rf (또는 find)와 regex를 가진 하나의 bash 명령으로 가능해야한다고 생각합니다. 이것이 가능한가?

참고 : 앞으로 더 많은 공간을 절약하기 위해 3 개의 파일 중 2 개를 삭제하는 것이 좋습니다. 즉 일반적인 패턴은 (i % n == 1) i가 파일의 인덱스이고 n이 임의의 숫자 (예 : 2 또는 3) 인 경우에만 KEEP입니다.

+0

질문 2 : 파일 트래버스 방식 및 파일 이름이 짝수로 끝나는 지 확인하는 것이 더 좋습니다. –

+0

rm -rf (또는 find)가 traversing을 수행한다고 가정했는데, 올바른 필터를 전달해야 할 필요가 있습니까? – memo

답변

3

다음과 같이 사용할 수 있습니다. 당신이 그것을 실행하기 전에

shopt -s globstar failglob 
rm -rf **/model*_weights.*{0,2,4,6,8}.h5 

나는 echo-rm -rf를 변경할 것입니다! 또는 printf '%s\n'은 더 명확한 출력을 제공합니다.

셸 옵션 globstar을 사용하면 **을 사용하여 재귀 일치를 수행 할 수 있습니다. failglob은 패턴과 일치하는 것이 없으면 명령이 실행되지 않도록합니다.

+0

'find '도 유혹스러운 선택처럼 보입니다. –

+0

thx !. 하나의 작은 잔소리. 에코를 할 때, 정보를 파싱하는 것을 매우 어렵게하는 개행이 없습니다. 새 줄을 추가 할 수 있습니까? – memo

+0

@memo 필자가 제안한대로'echo' 대신'printf'를 사용하면 각 디렉토리가 별도의 줄에 인쇄됩니다. –