Script Bash para renomear arquivos em um diretório

5

Eu estou tentando escrever um script que use um diretório como um parâmetro de linha de comando e repita os arquivos no diretório alterando sua extensão para .bu .

Eu achei que isso funcionaria, mas estou recebendo a saída '.bu' is not a target directory

#!/bin/bash

for  f in $1; do
  mv "$f".* .bu
done
    
por Michael James 24.04.2015 / 08:11

4 respostas

8
#!/bin/bash
cd $1
for f in *; do 
mv  "$f" "${f%.*}.bu"
done
    
por Maythux 24.04.2015 / 08:24
5

Tente isso (assumindo que $1 é uma pasta):

for f in $1/*; do 
  mv "$f" "$f.bu"
done

Ou use o utilitário renomear:

rename -v 's/$/\.bu/' $1/*

Esses comandos adicionam uma extensão. Se você quiser alterar a extensão existente , use:

rename -v 's/\.[^\.]+$/\.bu/' $1/*
    
por chaos 24.04.2015 / 08:23
2

Tomando a abordagem do KISS, eu recomendaria o seguinte script

#! /bin/bash
cd $1;
rename 's/$/\.bu/' *

Isso alterará o diretório de trabalho para o primeiro parâmetro e, em seguida, adicionará uma extensão .bu a todos os arquivos. Isso anula a necessidade de loop.

EDITAR:
Se você quiser alterar a extensão (em vez de apenas adicioná-la), você pode tentar

rename 's/\..*$/\.bu/' *

comando em vez disso, no script acima.

    
por Registered User 24.04.2015 / 08:27
1

$1 dentro de um script bash é uma referência ao primeiro argumento transmitido da linha de comando, portanto você está realmente tentando processar uma única pasta.

Já existem respostas sobre como resolver seu problema usando bash puro, mas gostaria de acrescentar que, se você precisar de uma melhor filtragem do que está sendo processado, poderá usar find com algumas opções para selecionar o arquivos a serem processados:

find <path_to_directory> -maxdepth 1 -type f

* < caminho_para_diretório > = caminho para o diretório

Em seguida, faça um loop pela lista de arquivos usando stdin redirection:

#!/bin/bash

while read file
do
    rename 's/\..*/\.bu/' $file
done <<< $(find $1 -maxdepth 1 -type f)
    
por kos 24.04.2015 / 08:51

Tags