Wie finde ich Dateien, drucke einige Standardinformationen zu diesen Dateien und drucke die Alpha-Zeichenanzahl jedes Dateinamens?

0

Ich möchte so etwas:

find "$dir" -type f -printf '%i:<alpha_char_count_of_base_filename>:%d:%p\n'

Dann möchte ich zuerst nach Inode-Nummer sortieren, dann nach alpha_char_count_of_base_filename. Ich glaube, ich habe einen Teil der Lösung herausgefunden.

Ich weiß, dass ich den alpha_char_count_of_base_filename mit diesem Code erhalten kann:

basename "$filename" | tr -cd [:alpha:] | wc -m

Es funktioniert jedoch nicht, so etwas zu versuchen (nicht lachen):

find "$dir" -type f -printf '%i:$(basename -print | tr -cd [:alpha:] | wc -m):%d:%p\n'

Ich habe viele Ideen ausprobiert und habe keine funktionierende Lösung gefunden. Hier ist eine andere Idee, die ich ausprobiert habe:

find "$dir" -type f -printf '%i:%d:%p\n' | awk 'BEGIN{FS=":";OFS=":";} {print $1,system("basename "$3" | tr -cd [:alpha:] | wc -m"),$2,$3"\n";}'

Das scheint mich näher zu bringen, aber es gibt den alpha_char_count_of_base_filename an der falschen Stelle aus. Ich bin mir auch nicht sicher, ob das eine gute Programmierform ist.

Mein Shell-Programmierbuch bietet mir nichts, was mir helfen könnte, eine Lösung für diese spezielle Frage zu finden. Google auch nicht (bis jetzt).

Dies wird als Lösung für diese Frage verwendet .

MountainX
quelle

Antworten:

2
find "$dir" -type f -printf '%i:%f:%d:%p\n' | 
awk -F: -v OFS=: '{n=$2; gsub(/[^[:alpha:]]/,"",n); $2=length(n); print}'

hmmm, brauche die temp Variable nicht:

awk -F: -v OFS=: '{gsub(/[^[:alpha:]]/,"",$2); $2=length($2); print}'
Glenn Jackman
quelle
Vielen Dank! Das einzige Problem ist, dass ich die Alpha-Zahl des gesamten Pfads anstelle des gewünschten Basisnamens (nur Dateiname) erhalte.
MountainX
Ich denke, ich kann damit leben. Danke. Ich werde diese Antwort akzeptieren, wenn keine Antwort auf den Basisnamen eingeht.
MountainX
@MountainX, hat meine Antwort so aktualisiert, dass nur der Basisname verwendet wird - er verwendet den %fFormatierungsspezifizierer, um den Basisnamen an awk zu senden, wo er durch die "
Alphalänge