![각 파일이 별도의 하위 폴더에 있는 수천 개의 파일을 추출하는 방법은 무엇입니까?](https://linux55.com/image/156638/%EA%B0%81%20%ED%8C%8C%EC%9D%BC%EC%9D%B4%20%EB%B3%84%EB%8F%84%EC%9D%98%20%ED%95%98%EC%9C%84%20%ED%8F%B4%EB%8D%94%EC%97%90%20%EC%9E%88%EB%8A%94%20%EC%88%98%EC%B2%9C%20%EA%B0%9C%EC%9D%98%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%B6%94%EC%B6%9C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
3,000명의 대상에 대한 영상 데이터가 포함된 폴더가 있습니다. 각 테마의 폴더에는 다른 많은 폴더가 있습니다. 루프를 사용하여 각 하위 폴더에서 하나의 파일을 추출하고 이를 다른 디렉터리로 이동한 다음 환자 ID에 따라 이름을 바꾸고 싶습니다. 예를 들어, /imaging/data/1100232/free Surfer/MRI/lh_ribbon.mgz 여기서 1100232 폴더 이름은 환자마다 변경되며 환자/폴더는 3,000개입니다. 각 환자의 lh_ribbon.mgz 파일을 추출하고 환자 ID를 기준으로 파일 이름을 바꾸고 싶습니다. 저는 Linux를 처음 접했습니다. 누구든지 도와줄 수 있나요? 감사해요
답변1
귀하는 신규 사용자이므로 이 솔루션을 단계별로 구축하겠습니다.
find
A다음 에서 모든 파일 찾기/imaging/
find /imaging/ -iname *.mgz
-exec \;
발견된 각 파일( 로 시작함)에 대해 명령을 한 번 실행하려면 하나를 추가하십시오 echo
(파일 이름은 로 표시됨 {}
).
find /imaging/ -iname *.mgz -exec echo {} \;
단순한 명령보다 더 복잡한 스크립트를 사용하여 대상 디렉터리와 발견된 파일 이름 $1 및 $2를 전달하는 sh -c
데 사용됩니다.-exec
find /imaging/ -iname *.mgz -exec sh -c 'echo $1 $2' sh {} "/path/to/store/patient/files/" \; 2>/dev/null
마지막으로 세 번째 디렉터리의 환자 ID에서 새 파일 이름을 형성하고 새 환자 ID를 파일 이름으로 사용하여 이전 위치에서 새 위치로 복사합니다.
find /imaging/ -iname *.mgz -exec sh -c 'p=${1#/*/*/}; p=${p%%/*}; echo cp $1 $2$p.mgz' sh {} "/path/to/store/patient/files/" \; 2>/dev/null
노트. 커밋하기 전에 실행하고 출력이 올바른지 확인할 수 있도록 cp
명령을 그대로 두었습니다 . echo
모든 것이 괜찮다면 삭제 echo
하고 실행하십시오.