
그렇게 보이지는 않겠지만 이것을 알아내기 위해 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센트.
위의 스크립트를 자유롭게 사용해 보십시오. 테스트해 본 결과 잘 작동합니다. 건배 :)