Shell: Apare os espaços em branco no início dos arquivos

0

Eu tenho 20k arquivos aqui, e pelo menos 1000 deles têm espaço em branco no começo.

Como posso remover espaços em branco com sed, por exemplo? O problema é que pode aparecer alguns nomes de arquivos duplicados. então eu preciso adicionar algo no final do arquivo. Digamos que isso seja "[1]".

É osx aqui, portanto, certifique-se de que seus exemplos também funcionem no UNIX.

    
por holms 28.03.2011 / 03:33

2 respostas

2

Você quer apenas alterar os arquivos no lugar ou criar uma cópia dos arquivos sem o espaço em branco inicial?

Se você fizer a alteração no local, os "nomes de arquivo duplicados" não deverão ser um problema.

Tente algo como:

find <directory> -type f -exec sed -i -e 's/^[[:space:]]*//' {} +
    
por 28.03.2011 / 04:38
1

Sua pergunta não é muito clara, mas supondo que você queira dizer que os nomes de arquivo têm espaços em branco iniciais, você deseja passar por cada nome de arquivo e se ele tiver espaço em branco principal renomeie-o.

Como o novo nome pode existir, você também precisa verificar isso.

#!/bin/bash

# rename files with leading whitespace.
# append [1], [2], and so forth, if the new name exists, until an unused name is found.

rename_file() {
  local old="$1" new="$2" count=1
  if [[ ! -e "${new}" ]]; then
    mv -v "${old}" "${new}"
  else
    while [[ -e "${new} [${count}]" ]]; do
      count=$((count + 1))
      [[ "${count}" -gt 100 ]] && exit 9 # make sure we don't accidentally loop forever...
    done
    mv -v "${old}" "${new} [${count}]"
  fi
}

[[ -n "$1" ]] && cd "$1"

/bin/ls -1 . | grep $'^[ \t]' | while read file; do
  newname="$(echo "${file}" | sed -i -e 's/^[[:space:]]*//')"
  rename_file "${file}" "${newname}"
done

Isso deve fazer o truque.

Execute-o no diretório correto ou forneça um diretório como argumento.

    
por 03.04.2011 / 01:31