선택한 파일을 제거하는 bash 스크립트

선택한 파일을 제거하는 bash 스크립트

field.%d.vtkC++ 코드를 실행할 때 생성되고 이름이 지정된 일련의 파일이 있습니다 . 코드는 for 루프 내에서 일련의 계산을 수행하고 루프 변수가 상수 이고 i%N == 0어디에 있을 때마다 출력을 덤프합니다. 실수로 설정했는데 이제 필요하지 않은 엄청난 양의 데이터가 생겼습니다. 또한 코드를 다시 실행하고 싶지 않습니다.iNN = 1

N모든 파일만 유지하고 나머지는 삭제하고 숫자가 field.%d.vtk연속 되도록 나머지 파일의 이름을 바꾸도록 bash 스크립트를 작성하려면 어떻게 해야 합니까 ? 사소한 일이라면 죄송합니다. 하지만 저는 bash 스크립팅에 대한 경험이 매우 제한되어 있습니다.

편집하다: N=1(실수로) 범위가 %d[0, 1, ..., O(100,000)](정말 큰 경우)에 있을 때 적합한 것은 N파일 N=100수를 O(1000) 정도로 줄이는 것입니다.

감사해요

답변1

N=100이면 이를 제거하는 것이 매우 쉽습니다. 다음은 00.vtk로 끝나지 않는 모든 파일을 삭제합니다.

find -name '*.vtk' -not -name '*00.vtk' -exec rm {} +

따라서 100.vtk, 200.vtk 등이 남게 됩니다.

그런 다음 연속적으로 만들려면 00을 제거하면 됩니다.

rename 00.vtk .vtk *.vtk

이는 표준 posix 이름 바꾸기를 가정합니다. Perl 이름 바꾸기를 설치한 경우 다음과 같습니다.

rename 's/00.vtk/.vtk/' *.vtk

답변2

for i in *.vtk
do
    [[ $i =~ \.([0-9]*)\. ]] && ((BASH_REMATCH[1] % 100 != 0)) && echo $i
done

이 명령을 두 번 확인한 경우 echo로 변경하세요 !rm

답변3

Bash( 4+) 전용 버전의 Paul 답변(따라서 100번째 파일 .vtk 파일, 로 끝나는 파일만 남기고 를 00.vtk제거하여 이름을 바꿉니다 00):

shopt -s extglob
rm ./!(*00).vtk
for f in ./*.vtk; do mv "$f" "${f%00.vtk}.vtk"; done

재귀성을 원할 경우:

shopt -s extglob globstar
rm ./**/!(*00).vtk
for f in ./**/*.vtk; do mv "$f" "${f%00.vtk}.vtk"; done

관련 정보