Renomeie os arquivos no diretório com base nos nomes dos arquivos em outro diretório

1

Não tenho certeza se isso foi perguntado aqui, mas aqui está o meu problema. Eu tenho arquivos em digamos dir1 chamado:

File 1.mp4
File 2.mp4
etc..

Agora, no diretório dir2 , tenho arquivos nomeados:

Sub 1.srt
Sub 2.srt
etc..

Como posso renomear o Sub 1.srt para que ele se torne File 1.srt . Então, basicamente, renomear todos os arquivos *.srt para ter o nome de *.mp4 files. Há a mesma quantidade de arquivos nos dois diretórios e o uso de printf %s\n * arquivos é classificado.

    
por holasz 21.11.2015 / 22:31

3 respostas

1

Como os dois diretórios contêm o mesmo número de arquivos, aqui está uma abordagem que salva nomes de arquivos em dois arrays e renomeia para cada índice na lista de índices de arrays (pois ambos os arrays têm o mesmo comprimento):

mp4paths=(dir1/*.mp4)              # save mp4 file names in array
mp4names=("${mp4paths[@]##*/}")    # remove leading path components
name=("${mp4names[@]%.*}")         # remove extension
srt=(dir2/*.srt)                   # save srt file names in array
for i in "${!srt[@]}"              # for each index in the list of array indices 
do                                 # do stuff here...
mv "${srt[$i]}" dir2/"${name[$i]}".srt
done

Isso deve funcionar com todos os tipos de nomes de arquivos.
Para uma "execução a seco", substitua mv por printf '%s -> %s\n' .

    
por 22.11.2015 / 02:36
1
paste -d=  <(ls dir2/*.srt)  <(ls dir1/*.mp4) | 
  perl -nlE 's/=dir1(.*).mp4/" "dir2$1.srt/; say("mv \"",$_, "\"")'  |
  bash
  • A primeira linha produz linhas como dir2/sub 1.srt=dir1/file 1.mp4
  • A segunda linha muda para mv "dir2/sub 1.srt" "dir2/file 1.srt"
  • terceira linha executa essas linhas
por 22.11.2015 / 00:05
0

Supondo que os arquivos provavelmente não são literalmente chamados de 'Arquivo 1.mp4' e 'Sub 1.srt' (embora o script ainda funcione se forem), mas que os números em ambos os conjuntos de arquivos correspondem:

#! /bin/sh

dir1='./dir1'
dir2='./dir2'

find "$dir1" -maxdepth 1 -name '*.mp4' | while IFS= read f ; do
    num=$(echo "$f" | sed -e 's/^.* \([0-9]\+\)\.mp4//')
    subtitle=$(find "$dir2" -maxdepth 1 -name "* $num.srt" | head -1)
    if [ -n "$subtitle" ] ; then
        bn=$(basename "$f" .mp4)
        mv "$subtitle" "$dir2/$bn.srt"
    fi
done

Observação: isso funcionará com todos os arquivos, exceto aqueles com novas linhas no nome do arquivo. O head -1 é para evitar que o script falhe se houver mais de um arquivo .srt com o mesmo número .... nessa situação, o primeiro arquivo encontrado será renomeado, o (s) outro (s) ignorado (s). / p>

Se você quiser que as legendas sejam movidas para o mesmo diretório dos arquivos .mp4, altere a linha mv para:

mv "$subtitle" "$dir1/$bn.srt"
    
por 22.11.2015 / 00:01