awk: read error (Is a directory) ??

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
TMTYD
Beiträge: 56
Registriert: 06.11.2017 06:38:26

awk: read error (Is a directory) ??

Beitrag von TMTYD » 03.12.2017 08:41:02

Hi

wie kann ich diesen Befehl umschreiben, das der fehler was im Thread Titel steht nicht mehr auftritt

Code: Alles auswählen

ls -lG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}

Benutzeravatar
Phineas
Beiträge: 226
Registriert: 20.06.2012 20:26:19

Re: awk: read error (Is a directory) ??

Beitrag von Phineas » 03.12.2017 23:01:22

Code: Alles auswählen

ls -lG | awk "{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}"

TMTYD
Beiträge: 56
Registriert: 06.11.2017 06:38:26

Re: awk: read error (Is a directory) ??

Beitrag von TMTYD » 04.12.2017 04:10:16

Hi

Danke erstmal, aber es kommt genau der gleiche Fehler.

Code: Alles auswählen

awk: read error (Is a directory)
Debian Stretch, Kernel 4.13



Benutzeravatar
Meillo
Moderator
Beiträge: 4653
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk: read error (Is a directory) ??

Beitrag von Meillo » 04.12.2017 07:05:01

Nachdem Phineas die Syntaxfehler gefixt hat, mache ich den Code mal lesbar:

Code: Alles auswählen

ls -lG | awk "
{
	k = 0
	for (i=0; i<=8; i++) {
		k += (substr(\$1, i+2, 1) ~ /[rwx]/) * 2 ^ (8-i)
	}
	if (k) {
		printf(\" %0o \", k)
	}
	print
}
"

Es waere schoen gewesen, wenn du uns auch gleich verraten haettest, was der Code macht bzw. machen soll, denn das haette uns Zeit gespart, es herauszufinden.

Es wird scheinbar die symbolische Darstellung der Rechte aus der `ls -l'-Ausgabe in die oktale Darstellung umgerechnert und dann der ls-Ausgabe vorran gestellt.



Bei mir tritt der Fehler uebrigens nicht auf.

Wie sieht denn das Verzeichnis aus, auf das du ihn anwenden willst? Tritt er immer auf, auch bei leeren Verzeichnissen, oder wenn nur regulaere Dateien darin sind?

Welche Version von awk hast du?
Use ed(1) once in a while!

Benutzeravatar
Phineas
Beiträge: 226
Registriert: 20.06.2012 20:26:19

Re: awk: read error (Is a directory) ??

Beitrag von Phineas » 04.12.2017 09:43:06

Meillo hat geschrieben: ↑ zum Beitrag ↑
04.12.2017 07:05:01
Bei mir tritt der Fehler uebrigens nicht auf.
Bei mir auch nicht, ich bekomme den Fehler hier nicht reproduziert.

Find sollte übrigens in der Lage sein, eine gleichwertige Ausgabe zu produzieren. Ein schneller Versuch:

Code: Alles auswählen

find -maxdepth 1 -printf ' %m ' -ls

TMTYD
Beiträge: 56
Registriert: 06.11.2017 06:38:26

Re: awk: read error (Is a directory) ??

Beitrag von TMTYD » 07.12.2017 04:25:09

also danke erstmal für die antworten,

meine awk version ist

Code: Alles auswählen

 mawk                             1.3.3-17+b3 
Der Code von Phineas ist auch ok, wie kann das jetzt als alias definieren? Etwa so ?

alias ri='find -maxdepth 1 -printf %m -ls'

ich habe mal jetzt ein alias gemacht das so aussieht:

Code: Alles auswählen

alias lso='ls -lG | awk "
{
        k = 0
        for (i=0; i<=8; i++) {
                k += (substr(\$1, i+2, 1) ~ /[rwx]/) * 2 ^ (8-i)
        }
        if (k) {
                printf(\" %0o \", k)
        }
        print
}
"
'

alias ri='find -maxdepth 1 -printf  %m  -ls'
und mal ausprobiert

Code: Alles auswählen

(root)-(~)->ri .ssh/
find: Der Pfad muss vor dem Ausdruck stehen: .ssh/
Try 'find --help' for more information.

(root)-(~)->lso .ssh/
insgesamt 8
 644 -rw-r--r-- 1 root 1320 Dez  5  2002 jcameron-key.asc
 644 -rw-r--r-- 1 root  101 Nov 20 20:57 zu_entfernende_Kernel
-bash: .ssh/: Ist ein Verzeichnis
wie kann ich das anderst definieren, bei find und/oder bei awk?

Benutzeravatar
Phineas
Beiträge: 226
Registriert: 20.06.2012 20:26:19

Re: awk: read error (Is a directory) ??

Beitrag von Phineas » 07.12.2017 17:58:00

TMTYD hat geschrieben: ↑ zum Beitrag ↑
04.12.2017 04:10:16
Danke erstmal, aber es kommt genau der gleiche Fehler.

Code: Alles auswählen

awk: read error (Is a directory)
Zeigst Du bitte auch, wie Du den Befehl aufgerufen hast?
(Ich vermute, dass Du da einen Ordnernamen angehängt hast)

TMTYD
Beiträge: 56
Registriert: 06.11.2017 06:38:26

Re: awk: read error (Is a directory) ??

Beitrag von TMTYD » 07.12.2017 20:08:17

ja genau das habe ich auch, den ich wollte die oktal rechte von den dateien im Ordner sehen

Code: Alles auswählen

ls -lG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print} /var/
so habe ich den befehl eingegeben

Benutzeravatar
Meillo
Moderator
Beiträge: 4653
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk: read error (Is a directory) ??

Beitrag von Meillo » 07.12.2017 20:37:34

TMTYD hat geschrieben: ↑ zum Beitrag ↑
07.12.2017 20:08:17
ja genau das habe ich auch, den ich wollte die oktal rechte von den dateien im Ordner sehen

Code: Alles auswählen

ls -lG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print} /var/
so habe ich den befehl eingegeben
Es fehlt noch immer das abschliessende Single-Quote. ;-)

Der Hinweis von Phineas wird der treffende sein. Du kannst awk Dateien als Argumente uebergeben, aber keine Ordner. Die Dateien, die du uebergibst, werden von awk *gelesen*. Es macht aber auch selten Sinn, Input nach awk zu pipen *und* Dateiargumente zu uebergeben.

Was du eigentlich willst ist, das Verzeichnis (hier /var) dem ls(1) zu geben und dann dessen Ausgabe durch den awk-Befehl zu pipen:

Code: Alles auswählen

ls -lG /var | awk '...'
Use ed(1) once in a while!

Benutzeravatar
Phineas
Beiträge: 226
Registriert: 20.06.2012 20:26:19

Re: awk: read error (Is a directory) ??

Beitrag von Phineas » 07.12.2017 23:03:04

Der awk-code ist derart “geescaped“, dass doppelte Anführungszeichen nötig sind.

Benutzeravatar
Meillo
Moderator
Beiträge: 4653
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk: read error (Is a directory) ??

Beitrag von Meillo » 07.12.2017 23:32:51

Phineas hat geschrieben: ↑ zum Beitrag ↑
07.12.2017 23:03:04
Der awk-code ist derart “geescaped“, dass doppelte Anführungszeichen nötig sind.
Stimmt. ;-)
Use ed(1) once in a while!

guennid
Beiträge: 11124
Registriert: 31.10.2002 19:15:35
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: bei Marburg

Re: awk: read error (Is a directory) ??

Beitrag von guennid » 07.12.2017 23:49:33

Meillo hat geschrieben:

Code: Alles auswählen

ls -lG | awk "
{
	k = 0
	for (i=0; i<=8; i++) {
		k += (substr(\$1, i+2, 1) ~ /[rwx]/) * 2 ^ (8-i)
	}
	if (k) {
		printf(\" %0o \", k)
	}
	print
}
"
So geschrieben könnte ich mich fast mit shell-Syntax anfreunden. :THX: :wink:

TMTYD
Beiträge: 56
Registriert: 06.11.2017 06:38:26

Re: awk: read error (Is a directory) ??

Beitrag von TMTYD » 08.12.2017 04:29:55

Ok, naja so richtig anfreunden kann ich mich nicht mit dem awk Befehl, wie muss den der find Befehl lauten was oben in meinem Thread steht, als alias?

Der Pfad muss vor dem Ausdruck stehen <--- Das dass nicht mehr erscheint, und er auf beliebige Ordner anwendbar ist.

Debian Stretch, Kernel 4.13


Benutzeravatar
Phineas
Beiträge: 226
Registriert: 20.06.2012 20:26:19

Re: awk: read error (Is a directory) ??

Beitrag von Phineas » 08.12.2017 15:07:45

Du kannst eine Funktion anstelle Alias definieren:

Code: Alles auswählen

lso () { find $1 -maxdepth 1 -printf ' %m ' -ls; }

Benutzeravatar
Meillo
Moderator
Beiträge: 4653
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: awk: read error (Is a directory) ??

Beitrag von Meillo » 08.12.2017 15:26:15

Phineas hat geschrieben: ↑ zum Beitrag ↑
08.12.2017 15:07:45
Du kannst eine Funktion anstelle Alias definieren:

Code: Alles auswählen

lso () { find $1 -maxdepth 1 -printf ' %m ' -ls; }
Ich wuerde auch eine Funktion nehmen.


Zur Implementierung: Man sollte die Variablenexpansion quoten, damit man auch Pfade mit Whitespace uebergeben kann.

Und dann funktioniert der Aufruf natuerlich nur mit genau einem Pflichtargument. Wenn man das variabler haben will, dann koennte man es so machen:

Code: Alles auswählen

lso() {
	[ "$#" -eq 0 ] && set .
	for i in "$@"; do
		find "$i" -maxdepth 1 -printf ' %m ' -ls
	done
}
Use ed(1) once in a while!

Antworten