Encontre todos os [nome do arquivo] .mp4 e renomeie [nome do arquivo] .audio [duplicado]

1

Então eu tenho um script que adiciona 2 filmes usando o áudio do arquivo $1.audio . O que eu gostaria de fazer é renomear qualquer arquivo no diretório com:

*.mp4 

Para:

*.audio 

Mantendo o nome do arquivo original.

    
por FreeSoftwareServers 27.10.2015 / 05:32

5 respostas

5

Você pode usar o comando rename . Não é portátil, mas existe em diferentes formas em diferentes distribuições.

No CentOS / RHEL e provavelmente no Fedora:

rename .mp4 .audio *.mp4

Deve fazer isso. De man rename no CentOS 6:

SYNOPSIS
       rename from to file...
       rename -V

DESCRIPTION
       rename  will  rename  the specified files by replacing the first occur-
       rence of from in their name by to.

No Ubuntu e provavelmente em qualquer variante do Debian:

rename 's/\.mp4$/.audio/' *.mp4

deve fazer isso. De man rename no Ubuntu 14.04:

SYNOPSIS
       rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified
       as the first argument.  The perlexpr argument is a Perl expression
       which is expected to modify the $_ string in Perl for at least some of
       the filenames specified.  If a given filename is not modified by the
       expression, it will not be renamed.  If no filenames are given on the
       command line, filenames will be read via standard input.

       For example, to rename all files matching "*.bak" to strip the
       extension, you might say

               rename 's/\.bak$//' *.bak
    
por 27.10.2015 / 06:08
4

Aqui está uma solução rápida e portátil que ainda lida com arquivos com nomes estranhos:

find . -name "*.mp4" -exec sh -c 'for i do mv -- "$i" "${i%.mp4}.audio"; done' sh {} +
    
por 27.10.2015 / 09:05
2

Use este loop for :

for f in *; do
  [ -f "$f" ] && mv -v -- "$f" "${f%.mp3}.audio"
done
  • for i in * faz um loop por todos os arquivos e diretórios (exceto arquivos de pontos) no diretório de trabalho atual e armazena o arquivo processado atual em $f
    • [ -f "$f" ] verifica se é um arquivo normal
    • mv -v renomeia o arquivo ( -- é que os nomes dos arquivos não serão interpretados como argumentos por engano)
    • ${f%.mp3}.audio remove a extensão .mp3 e adiciona a extensão .audio ( Expansão do parâmetro )
por 27.10.2015 / 07:49
0

Aqui está uma solução que usa find , sed e xargs . Esta solução funciona mesmo se houver espaços no nome.

Primeiro, obtém os arquivos usando find . Em seguida, obtém o nome base do arquivo usando sed . Finalmente, faz a mudança para mudar a extensão.

Observe que o código abaixo é multilinha para maior clareza. Você provavelmente deve executá-lo em uma linha.

# split into three lines for clarity
# should execute as one line
find . -maxdepth 1 -name '*.mp4'
| sed -r 's/.*\/([^/]+)\.mp4//g'
| xargs -ix mv "x.mp4" "x.audio"

Abaixo está uma solução alternativa usando basename . Esta solução pode funcionar com nomes contendo espaços (não testamos este).

Primeiro obtém todos os arquivos com a extensão .mp4 , depois obtém o nome base e finalmente renomeia cada um com a extensão de áudio.

# split into three lines for clarity
# should execute as one line
find . -maxdepth 1 -name '*.mp4' -print0
| xargs -0 -ix basename "x" .mp4
| xargs -ix mv "x.mp4" "x.audio"
    
por 27.10.2015 / 08:47
-1

Você pode usar

for file in 'ls *.mp4'; { mv $file 'echo $file | sed 's/.mp4/.audio/g''; }
    
por 27.10.2015 / 05:52