delete, em seguida, renomeie: mesmo nomes de arquivos diferentes extensões

0

Eu tenho um diretório contendo milhares de arquivos, cada arquivo tem uma duplicata. Um exemplo:

file1.txt
file1.jpg.txt

file2.txt
file2.jpg.txt

Eu quero excluir todos os arquivos * .txt e deixar o arquivo * .jpg.txt depois eu quero renomear todos os arquivos * .jpg.txt para * .txt apenas

Estou usando o OpenSuse 12

    
por Mostafa Hussein 12.11.2018 / 08:03

2 respostas

2

Como @roaima mencionou, você não precisa primeiro remover os arquivos; ao mover os arquivos, você sobrescreverá automaticamente os arquivos antigos.

Uma abordagem para isso é usar um loop for no bash:

for f in *.jpg.txt; do mv $f ${f/%.jpg.txt/.txt}; done

Deixe-me explicar:

  • for f in *.jpg.txt; do <command>; done : execute o comando em cada arquivo de *.jpg.txt . Enquanto a execução do nome do arquivo é armazenada na variável f .
  • ${f/%.jpg.txt/.txt} : O valor de $f , mas a última ocorrência de .jpg.txt foi substituída por .txt . Consulte o link para obter mais exemplos disso.
  • mv $f ${f/%.jpg.txt/.txt} : faça a renomeação do arquivo antigo para o novo nome de arquivo sem o .jpg .

Antes de executar este código, você pode assegurar-se de que será correto executar

for f in *.jpg.txt; do echo $f ${f/%.jpg.txt/.txt}; done

Isso imprimirá os pares de arquivos que serão movidos.

    
por 12.11.2018 / 09:12
-1
#!/bin/bash

## to remove ".txt" files

# this will keep the files which removing in txt
# you can see delete file on the script path
ls -lrth | grep ".txt" | grep -v "jpg" | awk -F' ' {'print $9'} > delete
terminal='tty'
exec < ${delete=delete}
        while read line
        do
                rm -rf $line
        done
exec < $terminal


## Renaming the files
# this will keep the files which we are renaming
# you can see rename file on the script path
ls -lrth | grep -i "jpg" | awk -F' ' {'print $9'} > rename 
terminal='tty'
exec < ${rename=rename}
        while read line
        do
                nn='echo $line | sed 's/.jpg//gi''
                mv $line $nn
        done
exec < $terminal
    
por 12.11.2018 / 09:45