Como criar vários diretórios e mover vários arquivos

1

Como exemplo, tenho um diretório com vários arquivos neste formato geral:

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

Estou tentando criar um script que separe os arquivos pelo identificador, criando um diretório usando esse identificador e mova os arquivos com o mesmo identificador para esse diretório.

No final da mudança, gostaria de ter algo como:

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

A partir de agora, acho que estou no caminho certo para o diretório:

awk _ {print $1} | uniq | mkdir

A sintaxe provavelmente não está correta, mas a ideia geral é imprimir a primeira coluna, separada por _ , omitindo repetições e, em seguida, inserindo esses nomes em mkdir . Mas então eu estou em uma perda para mover os arquivos para os diretórios. Eu estava pensando em usar grep da mesma forma (substituindo mkdir acima e, em seguida, canalizando para mv ), mas não tinha certeza se funcionaria.

    
por Trailing Penguin 06.02.2018 / 19:48

2 respostas

0

você pode listar seus arquivos na lista de ls > list , por exemplo,
em seguida, use uma leitura de loop para criar subpastas & então mova os arquivos despachando-os no bom de seu nome como um filtro padrão.

aqui fiz um teste a partir de arquivos vazios touch filename para demonstrar o método

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~

Você pode fazer uso direto no shell ou usar uma sintaxe semelhante em um script, é claro.

    
por 06.02.2018 / 20:13
-1
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
    
por 06.02.2018 / 20:16

Tags