특정 속성을 가진 파일을 찾아 해당 디렉터리 이름으로 이름을 바꾸고 다른 곳에 복사합니다.

특정 속성을 가진 파일을 찾아 해당 디렉터리 이름으로 이름을 바꾸고 다른 곳에 복사합니다.

그렇게 보이지는 않겠지만 이것을 알아내기 위해 3시간 이상을 소비했습니다... 특정 속성(이름 및 크기)을 가진 상위 디렉토리의 모든 하위 디렉토리에 있는 파일을 식별한 다음 파일 이름을 다음으로 바꾸려고 합니다. 하위 디렉터리 이름을 지정하고 상위 디렉터리에 복사합니다. 내 생각에 가장 가까운 시도는 다음과 같습니다.

find /data/data2/parent/ -size 25166176c -name "o*.nii" -exec cp {} $subdir/o*.nii $subdir.nii \;

이에 대해 "cp: target '/data/data2/parent/3145_V2.nii'는 디렉토리가 아닙니다"라는 두 줄을 얻었습니다. 두 속성을 모두 충족하는 파일이 하나만 있는지 확인했는데 거기에 있습니다. 또한 주목할 만한 점은 "parent/" 아래에 find 명령으로 선택해야 하는 관련 파일이 있는 두 개의 하위 디렉터리가 있지만 두 개 중 하나인 "parent/3145_v2"에 관한 오류만 인쇄했다는 것입니다(다른 하위 디렉터리는 무시한 것으로 보입니다). ).

답변1

나는 따르고 싶은 규칙이 있습니다. bash에서 단일 명령을 구성하는 데 30분 이상을 소비하면 Python 3으로 전환합니다.

이 문제는 Python으로 쉽게 해결할 수 있습니다.

#/usr/local/bin/python3

import os, re

DIR_TO_SEARCH = os.getcwd()   #change this to what you want

for (dirpath, dirnames, filenames) in os.walk(DIR_TO_SEARCH):
    if dirpath == DIR_TO_SEARCH:
        # you said you just want subdirectories, so skip this
        continue
    else:
        for name in filenames:
            full_path = dirpath + '/' + name
            #check for the attributes you're looking for. Change this to your needs.
            if re.search(r'o*\.nii', name) or os.path.getsize(full_path) > 0:
                #rename the file to its directory's name, and move it to the parent dir
                print('Moving {} to {}'.format(full_path, dirpath + '.nii'))
                os.rename(full_path, dirpath + '.nii')  

일반적으로 Python은 Bash 도구보다 플러그 앤 플레이 방식이 덜할 수 있지만 문서화가 매우 잘 되어 있고 버그가 거의 없다는 장점이 있습니다. 내 2센트.

위의 스크립트를 자유롭게 사용해 보십시오. 테스트해 본 결과 잘 작동합니다. 건배 :)

관련 정보