Ersetzen Sie Leerzeichen in Dateinamen über die Befehlszeile unter Unix

Ersetzen Sie Leerzeichen in Dateinamen über die Befehlszeile unter Unix

Hallo, ich habe eine Menge Dateien mit Leerzeichen im Namen. Gibt es eine Möglichkeit, sie in neue Dateien ohne Leerzeichen zu verschieben? Ich habe beispielsweise die Datei Hello World.pdf, die ich in Hello_World.pdf verschieben möchte. Für die eine Datei kann ich natürlich den Befehl mv verwenden, aber ich möchte dies mit allen Dateien in einem Ordner tun.

Danke

Antwort1

Du kannst den ... benutzentrodersedBefehle hierfür:

for file in *.pdf
do
    newname=$(echo $file | tr ' ' _)
    mv "$file" $newname
done

Beachten Sie, dass hier die neuere POSIX-Syntax zur Befehlsersetzung verwendet wird: $(Befehl).
Wenn Sie eine wirklich alte Bourne-Shell verwenden, müssen Sie Backticks verwenden:

newname=`echo $file | tr ' ' _`

Antwort2

Hier sind einige Skripte, die ich für diese Aufgabe verwende:

#!/bin/ksh
# Name     : unspace - replace spaces by underscores in file names
# Usage    : unspace [file ...]
# Example  : unspace *.doc
unspace()
{
  ls "$@" | while a=$(line)
  do
    file=$(echo $a | grep " ")
    if [ -n "$file" ]
    then
      file="$(print "$file" | sed 's/ /_/g')"
      print "$a" "->" "$file"
      mv "$a" "$file"
    fi
  done
}
[[ "$(basename $0)" = unspace ]] && unspace "$@"

Das Folgende korrigiert rekursiv alle Namen im aktuellen Verzeichnis. Beachten Sie, dass noch etwas Arbeit erforderlich ist, wenn Verzeichnisnamen auch eingebettete Leerzeichen enthalten.

#!/bin/ksh
find . |
  while a=$(line)
  do
          newName="$(print $a | tr ' ' '_')"
          if [ "$a" != "$newName" ]
          then
                  mv "$a" "$newName"
                  print $a moved
          else
                  print $a unchanged
          fi
  done

Antwort3

Wenn Sie Bash haben, müssen Sie keine externen Tools aufrufen

for file in *.pdf
do 
  if [ -f "$file" ];then
     echo mv "$file" "${file// /_}"
  fi
done

verwandte Informationen