Bash-Befehl für jede Datei in einem Ordner

31

Ich habe eine Reihe von Dateien, auf die ich den gleichen Befehl anwenden möchte, und die Ausgabe sollte den gleichen Namen wie die verarbeitete Datei enthalten, jedoch mit einer anderen Erweiterung.

Derzeit benenne ich /my/data/Andrew.doc in /my/data/Andrew.txt um. Dies möchte ich für alle .doc-Dateien aus dem Ordner / my / data / tun und den Namen beibehalten.

Ich habe mehrere Versionen ausprobiert, aber ich denke, ich habe etwas falsch in der Syntax, da ich ein Linux-Neuling bin.

Robert
quelle
→ ein etwas vollständigeres und praktischeres Beispiel: stackoverflow.com/a/43474757/444255
Frank Nocke

Antworten:

76

Es gibt mindestens hunderttausend Millionen verschiedene Möglichkeiten, dies zu erreichen, aber hier sind die Top-Kandidaten:

Die Bash for-Schleife

for f in ./*.doc; do
    # do some stuff here with "$f"
    # remember to quote it or spaces may misbehave
done

Verwenden find

Der findBefehl hat einen schönen kleinen execBefehl, der sich hervorragend zum Ausführen von Dingen eignet (mit einigen Einschränkungen). Suchen ist besser als einfaches Globbing, da Sie wirklich nach den ausgewählten Dateien filtern können. Achten Sie auf die ungerade Syntax.

find . -iname '*.doc' -exec echo "File is {}" \;

Beachten Sie, dass findrekursiv ist , so dass Sie verwenden möchten -maxdepth 1halten findin aktuellen Arbeitsverzeichnis. -type fkann verwendet werden, um reguläre Dateien herauszufiltern.

Wenn wir nur die Umbenennung doc zu txt ...

Das rename Befehl ist bei der Suche sed-like. Offensichtlich wird dies nichts zur Konvertierung des Formats beitragen.

rename 's/doc$/txt/' *.doc
Oli
quelle
22
for i in *.doc ; do mv "$i" $(echo $i | sed s/doc/txt/) ; done
DIRAVI
quelle