Por que esse script não funciona?

3

Eu tenho usado este script bash:

for i in $(ls); do mv $i a$i; done

para preceder todos os nomes de arquivos em uma pasta com a letra a. Eu tenho medo que em algum momento eu acidentalmente usarei este script no diretório errado e prefixar uma tonelada de nomes de arquivos que eu não quero prefixados. Então eu decidi explicitamente citar o caminho para o arquivo. Então agora meu script é assim:

for i in $(ls /cygdrive/c/Users/path/to/Images); do mv /cygdrive/c/Users/path/to/Images/$i /cygdrive/c/Users/path/to/Images/a$i; done

Ele prefixa o nome do arquivo com a letra a, mas também acrescenta o nome do arquivo com este símbolo..

Alguma idéia de por que isso faria isso?

Se isso ajudar, estou usando o cygwin em uma caixa do Windows 7.

Obrigado pela ajuda!

    
por Devin 01.10.2012 / 22:02

3 respostas

3

Nunca analise a saída de 'ls'. Faça isso:

for i in *; do mv "$i" "a${i}"; done

A razão é que os nomes dos arquivos podem ter caracteres como \ r ou \ n neles e a análise de 'ls' NÃO os encontrará.

Atualização: informações úteis neste link: link

Com as informações adicionadas acima do OP, use este:

for i in /cygdrive/c/Users/path/to/Images/*; do mv "$i" "${i%/*}/a${i##*/}"; done

ISTO FARÁ UMA COISA RELATIVAMENTE MAU ... renomeará TODOS os arquivos, toda vez que você executá-lo. Isso significa que o arquivo 'foo' será 'afoo'. Quando você executá-lo novamente, será 'aafoo' then 'aaafoo', etc. Você pode programar isso evitando quaisquer arquivos que comecem com 'a', mas isso evitará TODOS os arquivos que começam com 'a', mesmo que eles não tenham ainda foi renomeado no script.

    
por 01.10.2012 / 23:00
1

teste o diretório correto ou mova para o diretório correto (ou ambos):

de aqui

E_WRONG_DIRECTORY=73

TargetDirectory=/cygdrive/c/Users/path/to/Images

cd $TargetDirectory
echo "Changing names in $TargetDirectory."

if [ "$PWD" != "$TargetDirectory" ]
then    # Keep from wiping out wrong directory by accident.
  echo "Wrong directory!"
  echo "In $PWD, rather than $TargetDirectory!"
  echo "Bailing out!"
  exit $E_WRONG_DIRECTORY
fi  
    
por 01.10.2012 / 23:01
-2

Por favor, declare ls /cygdrive/c/Users/path/to/Images como uma variável. Por favor, use variável como ${i} em vez de $i . use também " " para o caminho.

    
por 01.10.2012 / 22:18