Como posso copiar um arquivo em um script bash e renomeá-lo ao copiar e colocá-lo no mesmo diretório

7

Como eu copiaria um arquivo "file.doc" e o renomeia enquanto copio para "file_copy.doc" e o coloco no mesmo diretório?

E isso apenas chamando o script e adicionando o nome do arquivo no argumento:

bash launch_copyer file.doc
    
por redaction 19.05.2015 / 15:39

5 respostas

4

Não há necessidade de bash aqui, qualquer implementação padrão do interpretador sh funcionará:

#! /bin/sh -
ret=0
for file do
  dir=$(dirname -- "$file")
  case $dir in
    (*[!/]*) dir=$dir/ # handle / and // specially
  esac
  base=$(basename -- "$file")
  name=${base%.*}
  name=${name:-$base} # don't consider .bashrc the extension in /foo/.bashrc
  ext=${base#"$name"}
  new_file=$dir${name}_copy$ext
  cp -- "$file" "$new_file" || ret=$?
done
exit "$ret"

(assume que os nomes dos arquivos e dir não terminam em caracteres de nova linha).

(claro, isso também funcionará com bash , já que bash é um desses padrão sh intérpretes .)

Para uma solução específica bash , você pode tentar:

#! /bin/bash -
ret=0
re='^((.*/)?[^/])(([^/]*)(\.))?([^/]*)/*$'
for file do
  if [[ $file =~ $re ]]; then
    if [[ ${BASH_REMATCH[5]} ]]; then
      suffix=_copy.${BASH_REMATCH[6]}
    else
      suffix=${BASH_REMATCH[6]}_copy
    fi
    cp -- "$file" "${BASH_REMATCH[1]}${BASH_REMATCH[4]}$suffix" || ret=$?
  else
    printf >&2 '%s\n' "$0: Error: refusing to copy $file"
    ret=1
 fi
done
exit "$ret"
    
por 19.05.2015 / 15:49
2

Como o OP está pedindo uma solução bash. Aqui está um que faz.

#!/bin/bash

if [[ ! -f $1 && $(($# != 1)) ]]; then 
    printf '%s\n' "Provide a filename"
    exit 1
fi

inFile="$1"
fileExt="${1#*.}"
destFile="${1%.*}"

cp -- "$inFile" "${destFile}_copy.$fileExt"  # As suggested, so the files that start with a dash are not ignored.
    
por 19.05.2015 / 16:05
1
#!/bin/bash
ss=0
for file do
    cp -fp -- "$file" "${file%.*}_copy.${file##*.}" || ss=$?
done
exit $ss

Isso falhará se file não tiver uma parte de extensão de ponto. Se você precisa disso, use a solução de Stéphane Chazelas .

    
por 19.05.2015 / 16:18
0
cp /example/directory/file.doc /example/directory/file_copy.doc

isto especifica o nome do arquivo e fará o que você quiser

    
por 19.05.2015 / 15:49
0

Tente isto:

#!/bin/bash
if [ -f "$1" ];
then
  cp -v "$1" _"$1"
  rename -v 's/_(.+?)\./$1_copy\./' _"$1"
fi

O script verifica se o arquivo de entrada que recebe como entrada existe. Nesse caso, ele faz uma cópia temporária do arquivo e renomeia essa cópia substituindo o primeiro ponto em seu nome pela string _copy.

Espero que seja o que você precisava.

    
por 17.05.2016 / 01:02