Shell: rogner les espaces au début des fichiers

0

J'ai 20k fichiers ici, et au moins 1000 d'entre eux ont un espace blanc au début.

Comment puis-je supprimer des espaces avec sed par exemple? Le problème est qu'il peut en résulter des noms de fichiers dupliqués. je dois donc ajouter quelque chose à la fin du fichier. Disons que ce serait "[1]".

C'est osx ici, alors assurez-vous que vos exemples fonctionnent également sous UNIX.

holms
la source
1
Les espaces sont-ils dans les noms de fichiers ou le contenu du fichier?
Dennis Williamson

Réponses:

2

Souhaitez-vous simplement modifier les fichiers en place ou créer une copie des fichiers sans les espaces blancs suivants?

Si vous effectuez la modification sur place, les "noms de fichiers dupliqués" ne devraient pas poser de problème.

Essayez quelque chose comme:

find <directory> -type f -exec sed -i -e 's/^[[:space:]]*//' {} +
Mikel
la source
1

Votre question n’est pas très claire, mais en supposant que vous entendiez le noms de fichiers avoir des espaces de début, vous souhaitez alors parcourir chaque nom de fichier et, s’il existe, les renommer.

Comme le nouveau nom existe peut-être, vous devez également vérifier cela.

#!/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

Cela devrait faire l'affaire.

Exécutez-le dans le bon répertoire ou donnez-lui un répertoire en argument.

ZILjr
la source