'ls -1': So listen Sie Dateinamen ohne Erweiterung auf

'ls -1': So listen Sie Dateinamen ohne Erweiterung auf

ls -1listet meine Elemente folgendermaßen auf:

foo.png
bar.png
foobar.png
...

Ich möchte, dass es ohne „ .pngGefällt mir“ aufgelistet wird, also:

foo
bar
foobar
...

(das Verzeichnis enthält nur .pngDateien)

Kann mir jemand sagen, wie ich es grepin 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 sedBefehl entfernt (d. h. er ersetzt durch die leere Zeichenfolge) alle Zeichenfolgen, .pngdie sich amEndeeines Dateinamens.

Das .wird maskiert, \.sodass es von sedals 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 .pngin 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, grepwenn Sie versuchen, Übereinstimmungen zu finden, und nicht nach Entfernen/Ersetzen, da dies sedangemessener 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'
  • -1Sie benötigen die Option nicht ls, da lsdavon ausgegangen wird, dass die Standardausgabe kein Terminal ist (in diesem Fall handelt es sich um eine Pipe).
  • die -nOption „to“ sedbedeutet „die Zeile standardmäßig nicht drucken“
  • die /pOption 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 .pngmit enden, wobei das .pngentfernt wurde. Das heißt, dies trägt auch der leichten Verallgemeinerung der Frage des OP Rechnung, bei der das Verzeichnis nicht nur .pngDateien enthält.

Die sed -nTechnik ist oft in Fällen nützlich, in denen Sie andernfalls grep+sed verwenden würden.

verwandte Informationen