Usar ls
é um pouco perigoso. Veja Por que * not * pars 'ls'?
Você também terá que separar o nome do arquivo, caso contrário, basta anexar $suffix
ao final, conforme descobriu.
Aqui segue uma solução usando find
e outra sem find
.
find . -type f ! -name '*.zip' -exec sh -c 'suffix="$1"; shift; for n; do p=${n%.*}; s=${n##*.}; [ ! -e "${p}_$suffix.$s" ] && mv "$n" "${p}_$suffix.$s"; done' sh "$suffix" {} +
Isso localizará todos os arquivos regulares em algum lugar no diretório atual, cujos nomes não terminam em .zip
.
Em seguida, o seguinte script de shell será invocado com uma lista desses arquivos:
suffix="$1" # the suffix is passed as the first command line argument
shift # shift it off $@
for n; do # loop over the remaining names in $@
p=${n%.*} # get the prefix of the file path up to the last dot
s=${n##*.} # get the extension of the file after the last dot
# rename the file if there's not already a file with that same name
[ ! -e "${p}_$suffix.$s" ] && mv "$n" "${p}_$suffix.$s"
done
Teste:
$ touch file{1,2,3}.txt file{a,b,c}.zip
$ ls
file1.txt file2.txt file3.txt filea.zip fileb.zip filec.zip
$ suffix="notZip"
$ find . -type f ! -name '*.zip' -exec sh -c 'suffix="$1"; shift; for n; do p=${n%.*}; s=${n##*.}; [ ! -e "${p}_$suffix.$s" ] && mv "$n" "${p}_$suffix.$s"; done' sh "$suffix" {} +
$ ls
file1_notZip.txt file3_notZip.txt fileb.zip
file2_notZip.txt filea.zip filec.zip
O script de shell acima pode ser executado independentemente de find
se o número de arquivos não for muito grande e se você não precisar recorrer a subdiretórios (apenas levemente modificados para pular nomes que não são arquivos):
#!/bin/sh
suffix="$1" # the suffix is passed as the first command line argument
shift # shift it off $@
for n; do # loop over the remaining names in $@
[ ! -f "$n" ] && continue # skip names of things that are not regular files
p=${n%.*} # get the prefix of the file path up to the last dot
s=${n##*.} # get the extension of the file after the last dot
# rename the file if there's not already a file with that same name
[ ! -e "${p}_$suffix.$s" ] && mv "$n" "${p}_$suffix.$s"
done
Com bash
, você executaria isso nos arquivos em um diretório como este:
$ shopt -s extglob
$ ./script.sh "notZip" !(*.zip)
Com a opção extglob
shell definida em bash
, !(*.zip)
corresponderia a todos os nomes no diretório atual que não terminam com .zip
.