여러 디렉터리를 만들고 여러 파일을 이동하는 방법

여러 디렉터리를 만들고 여러 파일을 이동하는 방법

예를 들어, 다음과 같은 일반 형식의 여러 파일이 포함된 디렉터리가 있습니다.

dir1/identifier1_desiredName1.m
dir1/identifier1_desiredName2
dir1/identifier1_desiredName3.m
dir1/identifier2_desiredName1.m
dir1/identifier2_desiredName2.m
dir1/identifier3_desiredName1.m
dir1/identifier3_desiredName2.m
dir1/identifier3_desiredName3
dir1/identifier4_desiredName1.m
dir1/identifier4_desiredName2.m
dir1/jabberwocky-mimsy-borogoves
dir1/other--should-not-be-moved

해당 식별자를 사용하여 디렉터리를 생성하여 해당 식별자로 파일을 구분한 다음 동일한 식별자를 가진 파일을 해당 디렉터리로 이동하는 스크립트를 작성하려고 합니다.

이동이 끝나면 다음과 같은 것을 원합니다.

dir1/identifier1/desiredName1.m
dir1/identifier1/desiredName2
dir1/identifier1/desiredName3.m
dir1/identifier2/desiredName1.m
dir1/identifier2/desiredName2.m
dir1/identifier3/desiredName1.m
dir1/identifier3/desiredName2.m
dir1/identifier3/desiredName3
dir1/identifier4/desiredName1.m
dir1/identifier4/desiredName2.m
dir1/jabberwocky-mimsy-borogoves
dir1/other--should-not-be-moved

현재로서는 디렉토리 생성이 올바른 방향으로 가고 있다고 생각합니다.

awk _ {print $1} | uniq | mkdir

구문이 정확하지 않을 수도 있지만 일반적인 아이디어는 첫 번째 열을 인쇄하고 구분하여 _중복 항목을 생략한 다음 해당 이름을 mkdir. 하지만 파일을 디렉토리로 옮기는 데 압도당했습니다. grep비슷한 것을 사용 하려고 생각 중입니다 ( mkdir위의 내용을 대체한 다음 파이핑 mv). 하지만 제대로 작동할지는 잘 모르겠습니다.

답변1

ls > list예를 들어 목록에 파일을 나열한 다음
파일을 읽는 루프를 사용하여 하위 폴더를 만든 다음 파일을 이동하고 패턴 필터로 이름에서 좋은 폴더로 디스패치할 수 있습니다.

touch filename여기에서는 방법을 시연하기 위해 빈 파일을 사용하여 테스트를 만들었습니다.

bash-4.4$ while read
> do
> if [ ! -d ${REPLY/_*/} ]; then
>    mkdir ${REPLY/_*/}
> fi
> done < list

bash-4.4$ #here directories are made then use similar method for moving files
bash-4.4$ while read; do  if [ -f $REPLY ] ; then mv $REPLY ${REPLY/_*/}/${REPLY/*_/} ; fi ;  done < list
bash-4.4$ tree
.
├── identifier
│   └── desiredName.m
├── identifier1
│   ├── desirename1.m
│   └── desirename.m
├── identifier2
│   └── desirename2.m
└── list

3 directories, 5 files
bash-4.4$ 5~

물론 셸에서 직접 사용할 수도 있고 스크립트에서 유사한 구문을 사용할 수도 있습니다.

답변2

find . -type f -name '*_*.m' | while read FP
do
  FN="${FP##*/}"
  DN="${FP%/*}"
  ID="${FN%_*}"
  echo $FP "=>" $DN "/" $ID "/" $FN
  mkdir "$DN/$ID" 2>/dev/null
  mv "$FP" "$DN/$ID"
done

관련 정보