Echonamen und Zeilenanzahl für jede Datei in einem Verzeichnis

Echonamen und Zeilenanzahl für jede Datei in einem Verzeichnis

Ich soll ein Shell-Skript schreiben, an das ich ein Befehlszeilenargument sende, das ein Verzeichnis darstellt. Dann soll ich alle Dateinamen und die Anzahl der Zeilen für jede Datei aus diesem Verzeichnis ausgeben. Ich soll dies auch nur für die 10 wichtigsten Dateien tun, die nicht älter als 10 Minuten sind.

find "$1" -cmin -10 -type f | head -10 

So habe ich versucht, die Dateien zu finden, die neuer als 10 Minuten sind, aber ich habe einige Fehler erhalten. Außerdem bin ich mir nicht sicher, wie ich an die Namen komme. Vielen Dank im Voraus für alle Hilfe.

Meine Dateinamen sind frei. Die Fehlermeldung, die ich erhalte, ist, dass die Berechtigung verweigert wird, wenn ich mein Home-Verzeichnis als Argument übergebe. Ich erhalte also nicht die Liste der Namen. Ich sollte sowohl die Liste der Dateinamen als auch die Anzahl der Zeilen jeder dieser Dateien erhalten.

Wenn ich etwas /bin/bash ss1 /home/ivanain das Terminal eingebe, erhalte ich die folgende Fehlermeldung:

find: '/home/ivana/.cache/dconf': Permission denied

Ich verwende Linux.

Antwort1

OK, das Wichtigste zuerst. Der Fehler, den Sie erhalten, ist irrelevant. Er bedeutet nur, dass /home/ivana/.cache/dconfIhnen ein bestimmtes Unterverzeichnis ( ) von $HOMEnicht gehört. Dies ist mit ziemlicher Sicherheit passiert, weil Sie eine grafische Anwendung mit ausgeführt haben sudo. Die einfache Lösung ist:

sudo chown -R ivana /home/ivana/

Dadurch wird der Eigentümer aller Dateien und Verzeichnisse in Ihrem $HOMEBacklog auf Ihren eigenen Benutzernamen geändert. Wenn Sie dort Dinge haben können, die korrekterweise einem anderen Benutzer gehören, ändern Sie einfach den Eigentümer des dconfVerzeichnisses:

sudo chown -R ivana /home/ivana/.cache/dconf

So können Sie dies richtig machen und mit beliebigen Dateinamen umgehen:

find "$1" -cmin -10 -type f -print0 | head -z -n 10 

Dadurch wird findjede gefundene Datei mit einem abschließenden statt einem Zeilenumbruch gedruckt \0. Dies stellt sicher, dass es mit Dateien funktioniert, deren Namen Zeilenumbruchzeichen enthalten. Die -zOption bewirkt, dass -getrennte Eingaben headgelesen werden .\0

Der nächste Schritt besteht darin, jede einzelne Datei zu lesen und die Anzahl ihrer Zeilen auszudrucken:

find "$1" -cmin -10 -type f -print0 | head -z -n 10 |
    while IFS= read -r -d '' file; do wc -l "$file"; done

Das IFS=setzt den Eingabefeldtrenner auf leer, das -rbewirkt , dass reader nicht \speziell behandelt wird ( \twird also nicht zu einem Tabulator) und das -d ''weist an, durch - getrennte Daten readzu lesen .\0

verwandte Informationen