Mover recursivamente arquivos específicos em diretórios aninhados para um nome derivado do caminho

0

Eu tenho alguns arquivos em diferentes diretórios aninhados. Todos os arquivos são nomeados Analysis.mzXML . Eu gostaria de tê-los todos em um só lugar, enquanto mudando o nome de cada um para algo diferente, dependendo dos diretórios que foram salvos anteriormente.

Sei que mover um arquivo e fornecer o nome do diretório foi mostrado anteriormente em outras perguntas, como isso , este e isso .

No entanto, eles usam apenas os programas para movê-los de um diretório para fora e alterar apenas o nome com base nesse diretório. No meu caso, gostaria que os arquivos fossem renomeados usando a rota inteira de diretórios aninhados

Os arquivos são salvos da seguinte forma:

/dir1/dir2/dir3/dir4/dir5/dir6/Analysis.mzXML

Cada Analysis.mzXML está aninhado em pastas de nomes diferentes. No entanto, dir6 tem o mesmo nome para todos os arquivos e, como não oferece informações valiosas, eu gostaria de ignorá-lo.

Minha expectativa é que, ao executar algum comando ou script, eu possa obter todos esses arquivos nomeados com sua rota específica da seguinte forma:

/dir1_dir2_dir3_dir4_dir5.mzXML

Estou apenas começando com o bash e não sei como resolver esse problema.

    
por minombreespollo 15.03.2018 / 14:39

2 respostas

0

Sua pergunta, conforme escrita, sugere que você quer procurar o sistema de arquivos inteiro por Analysis.mzXML files, mesmo que apareçam em /lib/perl5/5.14/Unicode/Collate/Locale , /proc/sys/net/ipv4/conf/all , /sys/devices/system/cpu/cpu0/cache , %código%, ou similarmente lugares improváveis / inapropriados - e que você deseja mover os arquivos para o diretório raiz, o que também parece improvável / inapropriado. Eu assumi que você está trabalhando em algum outro diretório.

Execute este comando:

find . -mindepth 7 -maxdepth 7 -type f -name Analysis.mzXML -exec sh -c 'for arg do echo mv -i -- "$arg" "$(echo "$arg" | sed -e "s|^\./||" -e "s|/dir6/Analysis\.mzXML|.mzXML|" -e "s|/|_|g")"; done' sh {} +

Você pode deixar de fora o /usr/share/doc/cmake/html/_sources Se você tiver certeza de que todos os arquivos -mindepth 7 -maxdepth 7 estão no sétimo nível. Este comando encontra todos os arquivos Analysis.mzXML no sétimo nível e os passa para um script mini-shell. Isso leva cada nome de caminho, retira o Analysis.mzXML no início e o ./ no final, junto com a parte dir6 do nome do arquivo, e altera todos os restantes Analysis caracteres para / . Isso deve produzir uma saída como esta:

mv -i -- ./dir1/dir2/dir3/dir4/dir5/dir6/Analysis.mzXML dir1_dir2_dir3_dir4_dir5.mzXML
mv -i -- ./the/quick/brown/fox/jumps/dir6/Analysis.mzXML the_quick_brown_fox_jumps.mzXML
mv -i -- ./over/the/lazy/dog/foo bar/dir6/Analysis.mzXML over_the_lazy_dog_foo bar.mzXML

Se isso parece certo, execute o comando novamente, mas exclua o primeiro _ (ou seja, altere echo para apenas echo mv ).

Notas:

  • Isso não confirma que o diretório do sexto nível é chamado de mv . Se encontrar um arquivo dir6 em Analysis.mzXML , ele renomeia esse arquivo codificar% em vez de dir11/dir12/dir13/dir14/dir15/dir16 .
  • O dir11_dir12_dir13_dir14_dir15_dir16_Analysis.mzXML fará com que dir11_dir12_dir13_dir14_dir15.mzXML peça confirmação se ele tentar mover um arquivo para um nome que já existe.
  • O -i deve protegê-lo contra argumentos que começam com mv . Isso não deve ser um problema, pois -- deve sempre começar com - .
  • Se você realmente quiser fazer isso a partir da raiz do sistema de arquivos, isso deve funcionar. Apenas $arg e siga as instruções acima.

Considerações finais: Isso pode falhar se você tiver um diretório chamado ./ . Então não faça isso.

    
por 03.04.2018 / 02:35
1

Se você estiver movendo apenas um arquivo com mv , especifique o nome do arquivo de origem e o nome do arquivo de destino OR no diretório de destino, se quiser que ele tenha o mesmo nome em um diretório diferente . por exemplo,

mv /path/to/Analysis.mzXML /new/directory/new-filename.mzXML

ou (mantendo o mesmo nome de arquivo no novo diretório):

mv /path/to/Analysis.mzXML /new/directory/

Se você estiver movendo vários arquivos, o destino DEVE ser um diretório. por exemplo,

 mv /path/to/*.mzXML /new/directory/

O mesmo acontece se você quiser copiar um arquivo ou arquivos com cp em vez de mv .

    
por 15.03.2018 / 14:52

Tags