AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1500965
Accepted
djsmiley2kStaysInside
djsmiley2kStaysInside
Asked: 2019-11-12 00:45:58 +0800 CST2019-11-12 00:45:58 +0800 CST 2019-11-12 00:45:58 +0800 CST

AWK - Crie um novo subdiretório e mova arquivos para ele com base no nome do arquivo

  • 772

Eu tenho muitos (cerca de 6000!) mp3s que gostaria de despejar em subdiretórios, com base no nome do arquivo. Atualmente eles estão todos em um único subdiretório. (Já existem alguns diretórios existentes para alguns artistas, não desejo tocar nos arquivos neles, no entanto, uma duplicata sobrescrevendo um arquivo existente é aceitável).

A maneira mais simples que vejo de fazer isso é criando um subdiretório com base no nome do arquivo, já que os arquivos são todos denominados artist.artist.album.track.mp3.

Depois de algumas pesquisas cheguei a:

for x in ./*.mp3; do awk x="${x}" -F. '{split(x,a,"."); mkdir a[1]; mv x a[1]/}'; done

No entanto, ele me diz que há um erro de sintaxe e regexp não terminado:

awk: cmd. line:1: x=./Dizzee.Rascal.Radio.1.Live.Lounge.03.That.s.Not.My.Name.mp3
awk: cmd. line:1:   ^ syntax error
awk: cmd. line:1: x=./Dizzee.Rascal.Radio.1.Live.Lounge.03.That.s.Not.My.Name.mp3
awk: cmd. line:1:     ^ unterminated regexp
awk: cmd. line:1: x=./Dizzee.Rascal.Ultimate.Streetdance.CD1.03.Flex.Dave.Spoon.Mix.mp3
awk: cmd. line:1:   ^ syntax error
awk: cmd. line:1: x=./Dizzee.Rascal.Ultimate.Streetdance.CD1.03.Flex.Dave.Spoon.Mix.mp3
awk: cmd. line:1:     ^ unterminated regexp

Acho que é porque o nome do arquivo não é fornecido entre marcas de fala, mas não tenho 100% de certeza.

Alguém pode ajudar - e pontos de bônus se você conseguir imprimir o progresso também.

linux bash
  • 1 1 respostas
  • 528 Views

1 respostas

  • Voted
  1. Best Answer
    Kamil Maciorowski
    2019-11-12T03:26:00+08:002019-11-12T03:26:00+08:00

    Por quê awk? OK, vamos supor awk…

    • x="${x}"antes do que você deseja que seja um programa -v(ou seja -v x="${x}", ), caso contrário, é interpretado como um programa. Esta é a razão pela qual você obtém erros de sintaxe.
    • Seu programa real não deve ser executado por linha de entrada, mas por awkchamada; então você precisa BEGIN.
    • Você provavelmente não quis dizer a[1]; talvez a[2].
    • O sem aspas /(ou seja, sem aspas no contexto de awk, não no shell) está errado.
    • mkdire mvnão são ações em awk. Eu acho que eles são interpretados como variáveis ​​(vazias). Há systemação, você pode usá-la. Mas como você precisa passar um nome de arquivo/diretório arbitrário, surgem esses problemas:

      • citação adequada;
      • vulnerabilidade de injeção de comando (uma parte do nome do arquivo pode ser interpretada como um comando).

    Eu digo para esquecer awkaqui. O código abaixo assume que você deseja diretórios nomeados a partir dos dois primeiros segmentos separados por pontos. Notas:

    • um arquivo chamado foo.mp3acionará um erro de mkdir -p ./foo.mp3/;
    • é muito fácil modificar o código para que ele use um, três ou outro número fixo de segmentos separados por pontos.

    for x in ./*.mp3; do
    
       # remove leading ./
       d="${x#./}"
    
       # first segment
       d1="${d%%.*}"
    
       # remainder
       d="${d#*.}"
    
       # second segment
       d2="${d%%.*}"
    
       #result
       d="./${d1}.${d2}/"
    
       mkdir -p "$d" && mv "$x" "$d"
    done
    

    Em qualquer caso, aconselho criar um diretório separado para trabalhar:

    cp -al my_music/ my_music_copy/
    cd my_music_copy/
    

    Isso usa hardlinks, por isso é rápido e quase não ocupa espaço em disco adicional. Processe a estrutura de diretório dentro my_music_copy/de . Se você errar muito, sempre pode se livrar my_music_copy/e começar de novo. Só depois de ter certeza de que tudo está em seu lugar dentro my_music_copy/de , remova my_music/e renomeie my_music_copy/para my_music/.


    Se não houver um número fixo de segmentos e alguma heurística for necessária, tente vidir; algo assim:

    find . -maxdepth 1 -type f -iname '*.mp3' | EDITOR=vi vidir -
    

    Então você pode usar o recurso "pesquisar e substituir" do editor escolhido para criar diretórios desejados de forma confiável (por exemplo, substituir ./Dizzee.Rascal.por ./Dizzee.Rascal/; mas ./Mozart.com ./Mozart/e ./W.A.Mozart.com ./W.A.Mozart/ou talvez com ./Mozart/também). Veja esta minha resposta .

    Vantagens:

    • Se algo der errado, apenas não salve o arquivo. Abortar e recomeçar.
    • Você não precisa processar todos os arquivos de uma vez. Arquivos (linhas) que você não tocar não serão movidos. Processe um pequeno pedaço para ter certeza de que esta parte está certa; salve, saia do editor. Chame o comando novamente para processar os arquivos restantes.
    • Você pode copiar os dados para outra ferramenta (por exemplo, uma planilha), processá-los, colar novamente, salvar e sair.
    • 1

relate perguntas

  • Notificar-enviar notificações aparecendo na janela

  • execute o contêiner do docker como root

  • Como ativar o sensor de impressão digital no domínio e no diretório ativo do Linux

  • Como alterar permanentemente Ctrl + C para Ctrl + K no CentOS 7?

  • como abrir um arquivo de escritório do WSL

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    Serviço do Windows 10 chamado AarSvc_70f961. O que é e como posso desativá-lo?

    • 2 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Marko Smith

    ssl.SSLCertVerificationError: falha na verificação do certificado [SSL: CERTIFICATE_VERIFY_FAILED]: não foi possível obter o certificado do emissor local (_ssl.c:1056)

    • 4 respostas
  • Marko Smith

    Como posso saber em qual unidade o Windows está instalado?

    • 6 respostas
  • Martin Hope
    Albin Como faço para ativar o WindowsXP agora que o suporte acabou? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 O "HTTPS Everywhere" ainda é relevante? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch O Windows 10 exclui muitos arquivos minúsculos muito lentamente. Algo pode ser feito para agilizar? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Como Ctrl+C e Ctrl+V funcionam? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve