Renomeando arquivos removendo substring delimitada

Renomeando arquivos removendo substring delimitada

Tenho muitas pastas e subpastas com arquivos com nome. 1. Introduction--- [ FreeCourseWeb.com ] ---.mp4Quero renomear todos os arquivos recursivamente (pastas e subpastas) para 1. Introduction.mp4suprimir apenas a substring --- [ FreeCourseWeb.com ] ---.

Responder1

Supondo que você queira renomear todos os arquivos que possuem um dígito no início do nome, contém a substring ---duas vezes, seguida imediatamente por .mp4no final do nome. Além disso, supondo que você queira remover o bit entre as duas ---substrings, incluindo essas próprias substrings:

find . -type f -name '[[:digit:]]*---*---.mp4' -exec sh -c '
    for pathname do
        mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
    done' sh {} +

Isso encontra todos os arquivos regulares com nomes que correspondem ao padrão fornecido, dentro ou abaixo do diretório atual e, em seguida, remove a correspondência da string de sufixo ---*---.mp4e adiciona o .mp4sufixo novamente.

Sem usar find(em bash):

shopt -s globstar nullglob dotglob

for pathname in ./**/[[:digit:]]*---*---.mp4; do
    [[ ! -f $pathname ]] && continue
    mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
done

Isto é essencialmente igual ao findcomando, mas também renomeará links simbólicos. As três opções de shell definidas no início ativam o **padrão globbing usado para correspondência recursiva em subdiretórios ( globstar), garantem que os padrões não correspondentes sejam excluídos em vez de mantidos sem expansão ( nullglob) e garantem que os padrões globbing correspondam aos nomes ocultos ( dotglob).

Na zshcasca:

for pathname in ./**/[[:digit:]]*---*---.mp4(.ND); do
    mv -i $pathname ${pathname%---*---.mp4}.mp4
done

Aqui, o ponto no qualificador glob (.ND)faz com que o padrão anterior corresponda apenas a arquivos regulares, enquanto Ne Datua como enable nullglobe dotglobin bash, mas apenas para este padrão específico.

Responder2

Usando a renameferramenta do util-linuxpacote (às vezes chamada de rename.ul) e find:

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename -i -- '--- [ FreeCourseWeb.com ] ---' '' {} \;

A opção -ipede permissão para substituir arquivos existentes.


Usando o script Perl de Larry Wall renamee find:

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename 's/--- \[ FreeCourseWeb.com \] ---//' {} \;

Os arquivos existentes não são substituídos por padrão, a menos que a opção -f/ seja usada. --forceVocê verá uma mensagem de erro ... already exists.

informação relacionada