Dateien auflisten *.pdf ausschließen *_book.pdf

Dateien auflisten *.pdf ausschließen *_book.pdf

Wie können alle Dateien im Verzeichnis aufgelistet und nach Muster ausgeschlossen werden?

Beispiel: all *.pdf exclude *_book.pdf. Ich versuche es so:

for $PDF in $(ls *.pdf | grep -v *_book.pdf);
do
   echo "File $PDF"
done

Ist das ein guter Weg? Gibt es noch andere Möglichkeiten?WennAussage oder anderes.

Antwort1

Nicht lsin Skripten verwenden.

Außerdem forsollte die Variable, die Sie in der Schleife deklarieren, kein Dollarzeichen haben. Das Dollarzeicheninterpoliertder Wert einer Variablen; $PDFliest sich also als „der aktuelle Wert der Variablen, deren Name PDF„ ist.“

for PDF in *.pdf
do
    case $PDF in
     *_book.pdf) continue;;
    esac
    echo "File $PDF"
done

Die caseSyntax schreckt manche Anfänger ab, aber ich bevorzuge sie iffür solche Dinge bei weitem. Aber wenn Sie es vorziehen, können Sie verwenden

    if [[ $PDF =~ _book\.pdf$ ]]; then
        continue
    fi

oder die Kurzschrift

    [[ $PDF =~ _book\.pdf$ ]] && continue

caseshhat den zusätzlichen Vorteil, dass es auf POSIX und sogar auf das gute alte Original Bourne portierbar ist sh.

Beachten Sie, dass das Muster in caseein Glob ist, während [[ $variable =~ regex ]]ein regulärer Ausdruck verwendet wird (es sollte also kein „ *vor“ stehen _book).

Antwort2

Mit shopt -s extglob(dies kann die Standardeinstellung auf Ihrem System sein, andernfalls legen Sie sie fest) können Sie die erweiterte Übereinstimmung verwenden, einschließlich negativer Übereinstimmungsmuster:

# Directry contents
>ls -1
1_book_not.pdf
1_book.pdf
1.pdf
1.txt

# With negative match
>ls -1 !(*_book).pdf
1_book_not.pdf
1.pdf

Antwort3

Ihr Ausdruck enthält einen kleinen Syntaxfehler for. Versuchen Sie stattdessen Folgendes:

for PDF in $(ls *.pdf | grep -v *_book.pdf);
do
   echo "File $PDF"
done

Das scheint gut zu funktionieren.

Antwort4

Eine weitere Möglichkeit ist die Verwendung von find:

find . -maxdepth 1 -name '*.pdf' ! -name '*_book.pdf'

Betrachten Sie beispielsweise ein Verzeichnis mit diesen vier Dateien:

$ ls
a_book.pdf  book.txt  nook.pdf  not_book1.pdf

Führen Sie jetzt unseren Befehl aus:

$ find . -maxdepth 1 -name '*.pdf' ! -name '*_book.pdf'
./not_book1.pdf
./nook.pdf

Wie es funktioniert

  • find .weist find an, eine Suche im aktuellen Verzeichnis zu starten.

  • -maxdepth 1weist find an, Unterverzeichnisse zu überspringen.

  • -name '*.pdf'weist find an, nach Dateien zu suchen, deren Namen mit enden .pdf.

  • ! -name '*_book.pdf'weist finds an, alle Dateien, deren Name mit endet, von der Ausgabe auszuschließen _book.pdf.

verwandte Informationen