(Bash) Renomeando a extensão dos arquivos

2

Estou com problemas ao tentar criar um script para renomear todos os arquivos do meu diretório para .txt no Linux.

Isso é o que eu tenho até agora.

#!/bin/bash

location_number=$(find /hw1/textarchive | wc -l)
org_path=/hw1/textarchive/!(*txt)
count=0

#for count in $location_number
#do
    # rename $org_path .txt 
    #rename $org_path *.txt
    # mv $org_path  $org_path.txt
#done

for count in $location_path
do
    rename $org_path .pro .txt *.pro  <-----was trying to just rename .pro to .txt (no luck)
done

echo done

Eu tentei usar mv e rename , mas não cheguei a lugar algum. Com o mv $org_path $org_path.txt quando eu executo, eu recebo um erro ao longo das linhas de (this file) is not a directory . Com rename ele seria executado sem nenhum erro, mas não renomearia nenhum arquivo para .txt .

    
por Paincakes 15.09.2017 / 15:36

1 resposta

3
for name in /hw1/textarchive/*.pro; do
    newname=${name%.pro}.txt
    echo mv "$name" "$newname"
done

ou menor,

for name in /hw1/textarchive/*.pro; do
    echo mv "$name" "${name%.pro}.txt"
done

(remova o echo quando tiver certeza de que está fazendo a coisa certa)

Isso itera sobre todos os arquivos .pro em /hw1/textarchive e os renomeia para .txt files. A substituição ${name%.pro} removerá a extensão .pro do final do nome em $name .

Se você quiser renomear todos arquivos:

for name in /hw1/textarchive/*; do
    echo mv "$name" "${name%.*}.txt"
done

O ${name%.*} removerá qualquer extensão no final do nome. Arquivos .txt existentes também serão processados, mas não terão seus nomes alterados. Arquivos sem extensão receberão uma nova extensão .txt . Isso também selecionará nomes de arquivos que não são arquivos (como diretórios), portanto, a seguinte alteração irá ignorar estes:

for name in /hw1/textarchive/*; do
    test -f "$name" || continue
    echo mv "$name" "${name%.*}.txt"
done

Pode ser prudente verificar se ainda não existe uma entrada de diretório com o novo nome:

for name in /hw1/textarchive/*; do
    test -f "$name" || continue
    test -e "${name%.*}.txt" && continue
    echo mv "$name" "${name%.*}.txt"
done

Em outra forma equivalente:

for name in /hw1/textarchive/*; do
    if [ -f "$name" ] && [ ! -e "${name%.*}.txt" ]; then
        echo mv "$name" "${name%.*}.txt"
    fi
done

O teste -f testa a existência do arquivo regular fornecido. O teste -e testa a existência do nome dado (não importa de que seja um nome).

Esta solução não requer bash (apenas um shell sh -compatible).

    
por 15.09.2017 / 15:41