Crie pastas de partes específicas de linhas em um arquivo de texto

0

Eu tenho pasta pai inclui subpastas. Em todas as pastas secundárias eu tenho pastas como segue:

Parent_folder
folder1
  folder_01_PAP_515151
  folder_02_PAPA_554651
  folder_03_PAPX_541313
  folder_04_PAP_654123
folder2
  folder_20_PAP_413513
  folder_02_PAPD_521354
  folder_055_PAP_685413
  folder_100_PAP_132312
folder3
  folder_11_PAPE_5313351
  folder_32_PAP_3513131
  folder_53_PAP_3213321
  folder_84_PAP_3313213

..

Eu usei o seguinte comando para listar todas as pastas e subpastas que contêm " PAP " e salvá-lo em um arquivo de texto "list.txt"

find -type d -name "*_PAP_" > list.txt

A saída foi a seguinte:

  ./folder1/folder_01_PAP_515151
  ./folder1/folder_04_PAP_654123
  ./folder1/folder_20_PAP_413513
  ./folder2/folder_055_PAP_685413
  ./folder2/folder_100_PAP_132312
  ./folder3/folder_32_PAP_3513131
  ./folder3/folder_53_PAP_3213321
  ./folder3/folder_84_PAP_3313213

Nessa lista, desejo criar novas pastas e os nomes dessas novas pastas devem conter as partes "three digits_PAP", por exemplo, "055_PAP", "32_PAP", "53_PAP", ... da lista anterior. A lista de novas pastas geradas deve ser:

 01_PAP
 04_PAP
 20_PAP
 055_PAP
 100_PAP
 32_PAP
 53_PAP
 84_PAP
    
por Jeff Schaller 10.07.2016 / 22:37

1 resposta

2

Se você tiver um arquivo (denominado list contendo, o seguinte e você para criar um diretório para cada nome de linha no arquivo, em que o nome do diretório é apenas a parte após ./folder?/folder_ .

./folder1/folder_01_PAP_515151
./folder1/folder_04_PAP_654123
./folder2/folder_055_PAP_685413
./folder2/folder_100_PAP_132312
./folder3/folder_32_PAP_3513131
./folder3/folder_53_PAP_3213321
./folder3/folder_84_PAP_3313213

Então você pode fazer.

cat list | sed -r -e 's~[.]/folder[0-9]+/folder_~~' | xargs -I{} mkdir -p «prefix»{}

  • Eu fiz isso para que os números das pastas tenham um ou mais dígitos.
  • Deixe o "prefixo" em branco, a menos que você queira um prefixo.

Se você deseja apenas renomear as pastas / diretórios originais, mantendo o conteúdo original, então você pode fazer:

Teste com este. Em seguida, remova o -n da renomeação para fazer isso de verdade.

find . -type d -name "*_PAP_" | rename -n 's~[.]/folder[0-9]+/folder_~~'

Observe que o padrão de pesquisa é o mesmo para rename e para sed . rename funciona em nomes de arquivos, sed funciona em arquivos ou fluxos.

As opções para sed :

  • -r usa expressões regulares estendidas (o dialeto da expressão regular a ser usado).
  • -e O próximo arg é a expressão (programa sed).
  • 's~[.]/folder[0-9]+/folder_~~' da expressão, citada para que a shell não a interprete.

A expressão explicada: s~[.]/folder[0-9]+/folder_~~

  • s faz uma pesquisa e substitui
  • ~ o caractere separador separa a expressão em seções, você pode usar qualquer caractere, mas deve usar o mesmo a cada vez. s~«search_for»~«replace_with»~«options» ou usando um caractere diferente s@«search_for»@«replace_with»@«options» .
  • «search_for» uma expressão regular:
    • [.] um ponto
    • /folder apenas o que diz.
    • [0-9] um dígito.
    • + um ou mais do átomo anterior (o dígito) (um ou mais dígitos).
    • /folder_ apenas o que diz.
  • «replace_with» Com o que substituí-lo, neste caso nada.
  • «option» nesta nota de caso, outras incluem i ignorar maiúsculas, g faça mais de uma vez (não apenas a primeira string encontrada).

A linguagem sed / rename é muito poderosa, embora complexa. As partes principais que você usaria são s (como usado aqui), e talvez próximo y , vale a pena aprender. Você também terá que aprender expressões regulares (também usadas pelo grep e outros comandos).

    
por 10.07.2016 / 22:49