#!/bin/bash
cd $1
for f in *; do
mv "$f" "${f%.*}.bu"
done
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
#!/bin/bash
cd $1
for f in *; do
mv "$f" "${f%.*}.bu"
done
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/*
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.
$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)