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

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

아닌 것 같지만 이 문제를 해결하기 위해 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센트.

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

관련 정보