아닌 것 같지만 이 문제를 해결하기 위해 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센트.
위의 스크립트를 자유롭게 사용해 보십시오. 테스트해 본 결과 잘 작동합니다. 건배:)