
Tenho muitas pastas e subpastas com arquivos com nome. 1. Introduction--- [ FreeCourseWeb.com ] ---.mp4
Quero renomear todos os arquivos recursivamente (pastas e subpastas) para 1. Introduction.mp4
suprimir 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 .mp4
no 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 ---*---.mp4
e adiciona o .mp4
sufixo 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 find
comando, 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 zsh
casca:
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 N
e D
atua como enable nullglob
e dotglob
in bash
, mas apenas para este padrão específico.
Responder2
Usando a rename
ferramenta do util-linux
pacote (às vezes chamada de rename.ul
) e find
:
find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
-exec rename -i -- '--- [ FreeCourseWeb.com ] ---' '' {} \;
A opção -i
pede permissão para substituir arquivos existentes.
Usando o script Perl de Larry Wall rename
e 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. --force
Você verá uma mensagem de erro ... already exists
.