
ls -1
listet meine Elemente folgendermaßen auf:
foo.png
bar.png
foobar.png
...
Ich möchte, dass es ohne „ .png
Gefällt mir“ aufgelistet wird, also:
foo
bar
foobar
...
(das Verzeichnis enthält nur .png
Dateien)
Kann mir jemand sagen, wie ich es grep
in diesem Fall verwenden soll?
Zweck: Ich habe eine Textdatei, in der alle Namen ohne Erweiterung aufgelistet sind. Ich möchte ein Skript erstellen, das die Textdatei mit dem Ordner vergleicht, um festzustellen, welche Datei fehlt.
Antwort1
ls -1 | sed -e 's/\.png$//'
Der sed
Befehl entfernt (d. h. er ersetzt durch die leere Zeichenfolge) alle Zeichenfolgen, .png
die sich amEndeeines Dateinamens.
Das .
wird maskiert, \.
sodass es von sed
als wörtliches .
Zeichen und nicht als regulärer Ausdruck interpretiert wird .
(was bedeutet, dass jedes Zeichen übereinstimmt). Das $
ist der Zeilenende-Anker, sodass es nicht .png
in der Mitte eines Dateinamens übereinstimmt.
Antwort2
Sie benötigen für diesen Job nur die Shell.
POSIX:
for f in *.png; do
printf '%s\n' "${f%.png}"
done
Mit zsh
:
print -rl -- *.png(:r)
Antwort3
Wenn Sie nur Bash verwenden möchten:
for i in *; do echo "${i%.png}"; done
Sie sollten nach greifen, grep
wenn Sie versuchen, Übereinstimmungen zu finden, und nicht nach Entfernen/Ersetzen, da dies sed
angemessener ist:
find . -maxdepth 1 -name "*.png" | sed 's/\.png$//'
Wenn Sie entscheiden, dass Sie einige Unterverzeichnisse erstellen müssen, um Ordnung in Ihre PNG-Dateien zu bringen, können Sie dies ganz einfach wie folgt ändern:
find . -name "*.png" | sed 's/\.png$//'
Antwort4
Eine andere sehr ähnliche Antwort (ich bin überrascht, dass diese spezielle Variante noch nicht erschienen ist) lautet:
ls | sed -n 's/\.png$//p'
-1
Sie benötigen die Option nichtls
, dals
davon ausgegangen wird, dass die Standardausgabe kein Terminal ist (in diesem Fall handelt es sich um eine Pipe).- die
-n
Option „to“sed
bedeutet „die Zeile standardmäßig nicht drucken“ - die
/p
Option am Ende der Ersetzung bedeutet „… und drucke diese Zeile, wenn eine Ersetzung vorgenommen wurde“.
Der Nettoeffekt davon besteht darin, dass nur die Zeilen ausgedruckt werden, die .png
mit enden, wobei das .png
entfernt wurde. Das heißt, dies trägt auch der leichten Verallgemeinerung der Frage des OP Rechnung, bei der das Verzeichnis nicht nur .png
Dateien enthält.
Die sed -n
Technik ist oft in Fällen nützlich, in denen Sie andernfalls grep+sed verwenden würden.