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 ls
in Skripten verwenden.
Außerdem for
sollte die Variable, die Sie in der Schleife deklarieren, kein Dollarzeichen haben. Das Dollarzeicheninterpoliertder Wert einer Variablen; $PDF
liest 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 case
Syntax schreckt manche Anfänger ab, aber ich bevorzuge sie if
fü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
case
sh
hat 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 case
ein 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 1
weist 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
.