Dateiberechtigungen

26

Dateiberechtigungen

Angepasst von der UIL - Computer Science Programming kostenlose Antwort Frage "Carla" für 2018 District.

Einführung

In UNIX-ähnlichen Betriebssystemen gehört jede Datei, jedes Verzeichnis oder jeder Link einem "Benutzer", der Mitglied einer "Gruppe" ist, und verfügt über bestimmte "Berechtigungen", die durch eine zehnstellige Zeichenfolge dargestellt werden, z. drwxrwxrwx ". Das erste Zeichen ist "d", "-" oder "l" (Verzeichnis, Datei oder Verknüpfung), gefolgt von drei Sätzen von "rwx" -Werten, die die Berechtigungen "Lesen, Schreiben, Ausführen" angeben. Der erste Satz enthält die Rechte des Benutzers, der mittlere Satz die Rechte der Gruppe und der dritte die Rechte aller anderen für dieses Objekt.

Die Verweigerung der Berechtigung für eines dieser Rechte wird durch ein '-' anstelle des 'r', 'w' oder 'x' dargestellt. Ein Beispiel für eine Verzeichnis-Berechtigungszeichenfolge wäre beispielsweise "drwxr - r--", was vollständige Verzeichnisrechte für den Benutzer, aber "Nur-Lese" -Rechte für das Gruppenmitglied und alle anderen angibt.

Jede "rwx" -Kombination kann auch durch einen Oktalwert (0-7) dargestellt werden, wobei das höchstwertige Bit die Leseberechtigung darstellt, das nächsthöhere Bit die Schreibberechtigung darstellt und das niedrigstwertige Bit die Ausführungsberechtigung darstellt.

Herausforderung

Bei einer vierstelligen Code-Zeichenfolge, die aus folgenden Zeichen besteht: 'D', 'F' oder 'L', gefolgt von einem dreistelligen oktalen Ganzzahlwert, wie z. B. 664, wird die resultierende 10-stellige Zeichenfolge ausgegeben, die den Berechtigungswert darstellt angezeigt.

Eingang

Ihr Programm oder Ihre Funktion kann entweder die Standardeingabe einlesen (es werden vier Zeichen eingegeben, optional gefolgt von einer neuen Zeile) oder die Eingabe als Argument übergeben.

Ihr Programm akzeptiert möglicherweise Eingaben in Groß- oder Kleinbuchstaben, muss jedoch konsistent sein (entweder sind alle Eingaben in Großbuchstaben oder alle Eingaben in Kleinbuchstaben).

Ausgabe

Ihr Programm muss die resultierende zehnstellige Zeichenfolge drucken, die den Berechtigungswert darstellt, der im oben angegebenen genauen Format angegeben ist. Leerzeichen dürfen angefügt werden.

Testfälle

In: F664Out: -rw-rw-r--
In: D775Out: drwxrwxr-x
In: L334Out: l-wx-wxr--
In: F530Out: -r-x-wx---
In: D127Out:d--x-w-rwx

Wertung und Regeln

Billylegota
quelle
Warten Sie was, fragte gestern und antwortete bereits angenommen? Bedeutet das, dass keine weiteren Antworten erwartet werden oder was?
Nit
1
@Nit Weitere Antworten sind immer willkommen, unabhängig davon, ob eine Antwort akzeptiert wird.
Isaacg
1
@Nit Ich war auf dem Handy und habe versucht, eine nicht verwandte Antwort abzustimmen (die seitdem entfernt wurde). Ich habe versehentlich mit meinem dicken Finger auf die Schaltfläche zum Annehmen einer Antwort geklickt. Ich konnte nicht herausfinden, wie ich nicht akzeptieren sollte, und habe die akzeptierte Antwort ab sofort auf die kürzeste Antwort geändert.
Billylegota
2
@Nit ich meine ... er hat eine Dennis-Antwort akzeptiert, also kann er ehrlich sein.
Magic Octopus Urn

Antworten:

7

Jelly , 19 Bytes

“rwx“-”Œp⁺;Ṁ⁾f-yị@~

Probieren Sie es online!

Wie es funktioniert

“rwx“-”Œp⁺;Ṁ⁾f-yị@~  Main link. Argument: s (string)

“rwx“-”              Set the return value to ["rwx, "-"].
       Œp            Take the Cartesian product, yielding ["r-", "w-", "x-"].
         ⁺           Take the Cartesian product, yielding
                     ["rwx", "rw-", "r-x", "r--", "-wx", "-w-", "--x", "---"].
          ;Ṁ         Append the maximum of s (the letter).
            ⁾f-y     Translate 'f' to '-'.
                  ~  Map bitwise NOT over s.
                     This maps the letter to 0, because it cannot be cast to int,
                     and each digit d to ~d = -(d+1).
                ị@   Retrieve the results from the array to the left at the indices
                     calculated to the right.
                     Indexing is modular and 1-based, so the letter from s is at
                     index 0, "---" at index -1, ..., and "rwx" at index -8.
Dennis
quelle
16

Bash, 59 53 Bytes

chmod ${1:1} a>a;stat -c%A a|sed s/./${1:0:1}/|tr f -

Richtiges Werkzeug für den Job?

Vielen Dank an Dennis für das Speichern von 5 Bytes und HTNW für das Speichern von einem.

Probieren Sie es online!

chmod ${1:1} a>a;  # call chmod with the input with its first character removed
                   # note that the redirection creates the file a *before* the
                   #   chmod is run, because of the way bash works
stat -c%A a|       # get the human readable access rights
sed s/./${1:0:1}/  # replace the first character with the first char of input
|tr f -            # transliterate, replacing f with -
Türknauf
quelle
Na das ging ja schnell. Mit Sicherheit das richtige Werkzeug für den Job.
Billylegota
chmod ${1:1} a>a;stat -c%A a|sed "s/-/\L${1:0:1}/;s/f/-/"spart zwei Bytes.
Dennis
Wenn Sie @Dennis loslegen, können Sie sich wahrscheinlich mit einer weiteren Rasur abschneiden, transtatt mit y:chmod ${1:1} a>a;stat -c%A a|sed s/./\\L${1:0:1}/|tr f -
HTNW
2
Ist es legitim anzunehmen, dass keine Datei vorhanden ist aund der Benutzer die Berechtigung hat, diese zu erstellen, oder ist die Datei vorhanden aund der Benutzer kann sie beschreiben? Denn wenn es eine Datei avon Besitz rootmit Berechtigungen 700, sollte dies nicht funktionieren.
NoOneIsHere
2
@NoOneIsHere Obwohl Berechtigungen in der Diskussion nicht erwähnt wurden, hat die Community entschieden, dass das Erstellen temporärer Dateien im aktuellen Verzeichnis standardmäßig zulässig ist . Durch die Erweiterung können wir davon ausgehen, dass es möglich ist.
Dennis
10

Python 2 , 78 Bytes

lambda a,*b:[a,'-'][a=='f']+''.join('-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]for x in b)

Nimmt die Eingabe als Zeichen und drei Ints.
Probieren Sie es online!

Erläuterung

[a,'-'][a=='f']Nimmt entweder das eingegebene Zeichen oder -, wenn das Zeichen ist f.
'-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]ist im Wesentlichen eine oktale Umwandlung, um den rwxString zu erhalten.


quelle
5

Perl 5 mit -p37 Bytes

s/\d/(<{-,r}{-,w}{-,x}>)[$&]/ge;y;f;-

Nimmt Eingaben in Kleinbuchstaben vor.

Probieren Sie es online!

Dom Hastings
quelle
5

Retina 0.8.2 , 43 Bytes

\d
$&r$&w$&x
f|[0-3]r|[0145]w|[0246]x
-
\d

Probieren Sie es online! Link enthält Testfälle. Übernimmt die Eingabe in Kleinbuchstaben. Erläuterung:

\d
$&r$&w$&x

Verdreifachen jede Ziffer, suffixing mit r, wund x.

f|[0-3]r|[0145]w|[0246]x
-

Ändern Sie alle falschen Buchstaben in -s.

\d

Löschen Sie alle verbleibenden Ziffern.

Neil
quelle
4

Netzhaut , 51 Bytes

f
-
0
---
1
--x
2
-w-
3
-wx
4
r--
5
r-x
6
rw-
7
rwx

Probieren Sie es online!

Keine Ahnung, wie man Retina benutzt, also lass es mich wissen, wie ich das besser machen kann. Ich dachte nur, ich würde versuchen, mindestens eine Sprache zu lernen, die nicht Pyth ist.

Erläuterung:

Ersetzen Sie fdurch -(belassen dund lunverändert), und ersetzen Sie dann jede Ziffer durch die entsprechende rwx.


quelle
: / Ich kann soweit kommen diese aber nicht weiter. und der kluge Weg ist super ungolfisch
ASCII
Es wäre so viel golfer mit einer Art ternären / logischen oder / add und trim-Operatoren
ASCII-
@ Nur ASCII Ihre Idee war ganz nett, ich habe es für diese Antwort verwendet :)
Leo
4

JavaScript (ES6), 63 Byte

Erwartet die Eingabezeichenfolge in Kleinbuchstaben.

s=>s.replace(/\d|f/g,c=>1/c?s[c&4]+s[c&2]+s[c&1]:'-',s='-xw-r')

Probieren Sie es online!

Kommentiert

s => s.replace(   // replace in the input string s
  /\d|f/g, c =>   //   each character c which is either a digit or the letter 'f'
    1 / c ?       //   if c is a digit:
      s[c & 4] +  //     append '-' or 'r'
      s[c & 2] +  //     append '-' or 'w'
      s[c & 1]    //     append '-' or 'x'
    :             //   else:
      '-',        //     just replace 'f' with '-'
  s = '-xw-r'     //   s holds the permission characters
)                 // end of replace()
Arnauld
quelle
4

Kohle , 27 Bytes

FS≡ιdιlιf¦-⭆rwx⎇§↨⁺⁸Iι²⊕λκ-

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

 S                          Input string
F                           Loop over characters
   ι                        Current character
  ≡                         Switch
    d                       Literal `d`
     ι                      Implicitly print current character
      l                     Literal `l`
       ι                    Implicitly print current character
        f                   Literal `f`
         ¦                  (Separator between string literals)
          -                 Implicitly print literal `-`
                            Implicit default case
            rwx             Literal `rwx`
           ⭆                Map over characters
                     ι      Input character
                    I       Cast to integer
                   ⁸        Literal 8
                  ⁺         Sum
                      ²     Literal 2
                 ↨          Base conversion
                        λ   Inner index
                       ⊕    Incremented
                §           Index into base conversion
                         κ  Inner character
                          - Literal `-`
               ⎇            Ternary
                            Implicitly print
Neil
quelle
4

Haskell , 84 83 81 Bytes

f 'f'='-'
f y=y
t#n=f t:((\x->["-r"!!div x 4,"-w-w"!!div x 2,"-x"!!mod x 2])=<<n)

Probieren Sie es online!

Hat sich im Konzept der Antwort von Python 2 von Mnemonic ziemlich ähnelt. Wenn Sie den Dateityp erstellen, erhalten Sie die Berechtigungen der Oktalzahl. Dieser hat mich wirklich zum Wünschen verleitet und war ein bitweiser und im Vorspiel enthaltener Operator.

Aoemica
quelle
2
Sie können divanstelle von verwenden quot.
Nimi
4

Java 8, 100 Bytes

s->s.replaceAll("(\\d)","$1r$1w$1x").replaceAll("f|[0-3]r|[0145]w|[0246]x","-").replaceAll("\\d","")

Probieren Sie es online aus.

Port of @Neils Retina Antwort .

Erläuterung:

s->                                 // Method with String as both parameter and return-type
  s.replaceAll("(\\d)","$1r$1w$1x") //  Replace every digit `d` with 'drdwdx'
   .replaceAll("f                   //  Replace every "f",
                |[0-3]r             //  every "0r", "1r", "2r", "3r",
                |[0145]w            //  every "0w", "1w", "4w", "5w",
                |[0246]x",          //  and every "0x", "2x", "4x", "6x"
               "-")                 //  with a "-"
   .replaceAll("\\d","")            //  Remove any remaining digits
Kevin Cruijssen
quelle
Das ist schlau! ;)
Olivier Grégoire
@ OlivierGrégoire Na ja, vor allem, weil es auf die return-Anweisung und Schleifen spart. Schade drei Einzel .replaceAllist immer noch weniger Bytes als eine Schleife mit .replaceAllund fügte hinzu , returnund String-Array .. Aber Kredit natürlich geht an Neil , der Retina ist Antwort , die ich als Basis - Port verwendet aus.
Kevin Cruijssen
3

Jelly , 21 Bytes

Ḣ⁾f-yɓOBṫ€4a“rwx”o”-ṭ

Ein vollständiges Programm zum Drucken nach STDOUT. (Als monadischer Link ist der Rückgabewert eine Liste mit einem Zeichen und einer Liste mit drei Zeichenlisten.)

Probieren Sie es online! Oder sehen Sie sich die Testsuite an .

Wie?

Ḣ⁾f-yɓOBṫ€4a“rwx”o”-ṭ | Main Link: list of characters
Ḣ                     | head & pop (get the 1st character and modify the list)
 ⁾f-                  | list of characters = ['f', '-']
    y                 | translate (replacing 'f' with '-'; leaving 'd' and 'l' unaffected)
     ɓ                | (call that X) new dyadic chain: f(modified input; X)
      O               | ordinals ('0'->48, '1'->59, ..., '7'->55 -- notably 32+16+value)
       B              | convert to binary (vectorises) (getting three lists of six 1s and 0s)
        ṫ€4           | tail €ach from index 4 (getting the three least significant bits)
           “rwx”      | list of characters ['r', 'w', 'x']
          a           | logical AND (vectorises) (1s become 'r', 'w', or 'x'; 0s unaffected)
                 ”-   | character '-'
                o     | logical OR (vectorises) (replacing any 0s with '-'s)
                   ṭ  | tack (prepend the character X) 
                      | implicit print (smashes everything together)
Jonathan Allan
quelle
3

Perl 6 -p , 37 Bytes

s:g[\d]=[X~]('-'X <r w x>)[$/];s/f/-/

Probieren Sie es online!

Port of Dom Hastings Perl 5-Lösung.

nwellnhof
quelle
3

Retina , 38 Bytes

Inspiriert von einem Kommentar von nur ASCII .

\d
---$&*
---____
r--
--__
w-
-_
x
f
-

Probieren Sie es online!

Die Idee ist, jede Ziffer in eine unäre Zahl umzuwandeln (die standardmäßige unäre Ziffer in Retina ist _), wobei drei vorangestellt sind -, und dann Binärziffern von den meisten in die niedrigstwertige Zahl umzuwandeln.

Löwe
quelle
2

Python 3 , 71 Bytes

lambda s:("-"+s)[s[0]!="f"]+stat.filemode(int(s[1:],8))[1:]
import stat

Probieren Sie es online!

Python 3.3+ verfügt über eine integrierte Funktion, die jedoch aufgrund der Notwendigkeit eines Imports und der Unterschiede im erwarteten Eingabeformat nicht sehr golffreundlich ist.

Kirill L.
quelle
2

Tcl , 139 Bytes

proc P s {join [lmap c [split $s ""] {expr {[regexp \\d $c]?"[expr $c&4?"r":"-"][expr $c&2?"w":"-"][expr $c&1?"x":"-"]":$c==f?"-":$c}}] ""}

Probieren Sie es online!


Tcl , 144 Bytes

proc P s {join [lmap c [split $s ""] {expr {[regexp \\d $c]?[list [expr $c&4?"r":"-"][expr $c&2?"w":"-"][expr $c&1?"x":"-"]]:$c==f?"-":$c}}] ""}

Probieren Sie es online!

Tcl , 149 Bytes

proc P s {join [lmap c [split $s ""] {if [regexp \\d $c] {list [expr $c&4?"r":"-"][expr $c&2?"w":"-"][expr $c&1?"x":"-"]} {expr {$c==f?"-":$c}}}] ""}

Probieren Sie es online!

Tcl , 150 Bytes

proc P s {join [lmap c [split $s ""] {if [regexp \\d $c] {set v [expr $c&4?"r":"-"][expr $c&2?"w":"-"][expr $c&1?"x":"-"]} {expr {$c==f?"-":$c}}}] ""}

Probieren Sie es online!

Tcl , 180 Bytes

proc P s {join [lmap c [split $s ""] {if [regexp \\d $c] {[set R regsub] (..)1 [$R (.)1(.) [$R 1(..) [$R -all 0 [format %03b $c] -] r\\1] \\1w\\2] \\1x} {expr {$c==f?"-":$c}}}] ""}

Probieren Sie es online!

Immer noch sehr ungolfed!

Sergiol
quelle
2

Java (JDK 10) , 118 Byte

s->{var r=s[0]=='f'?"-":""+s[0];var z="-xw r".split("");for(int i=0;++i<4;)r+=z[s[i]&4]+z[s[i]&2]+z[s[i]&1];return r;}

Probieren Sie es online!

Credits

Olivier Grégoire
quelle
2
Wenn Sie die Eingabe als Klein nehmen fdl, können Sie die Änderung var r=s[0]<70?"d":s[0]<72?"-":"l";auf var r=s[0]=='f'?"-":s[0]+"";6 Bytes zu speichern. Auch .toCharArray()lassen sich .split("")weitere 4 Bytes einsparen.
Kevin Cruijssen
2
@KevinCruijssen Deine Idee hat mich 13 Bytes sparen lassen, nicht 10 (da ich das ""+später entfernen konnte, um a charin a "umzuwandeln" String;) Danke!
Olivier Grégoire
2

Excel, 224 Bytes

=IF(LEFT(A1,1)="f","-",LEFT(A1,1))&CHOOSE(MID(A1,2,1)+1,"---","--x","-w-","-wx","r--","r-x","rw-","rwx")&CHOOSE(MID(A1,3,1)+1,"---","--x","-w-","-wx","r--","r-x","rw-","rwx")&CHOOSE(MID(A1,4,1)+1,"---","--x","-w-","-wx","r--","r-x","rw-","rwx")

In 4 Schritten erledigt:

IF(LEFT(A1,1)="f","-",LEFT(A1,1))    Replace "f" with "-".

Und 3 mal:

CHOOSE(MID(A1,2,1)+1,"---","--x","-w-","-wx","r--","r-x","rw-","rwx")

Der Versuch, schlauer zu sein, fügt 25 bytespro Satz von Rechten insgesamt 75 hinzu:

IF(INT(MID(A1,2,1))>3,"r","-")&IF(MOD(MID(A1,2,1),4)>1,"w","-")&IF(ISODD(MID(A1,2,1)),"x","-")
Wernisch
quelle
2

05AB1E , 34 27 Bytes

ćls8βbvyi…rwx3*Nèë'-}J'f'-:

Probieren Sie es online!

7 Bytes von @MagicOctopusUrn abgespielt


ć                           # Remove head from string.
 ls                         # Lowercase swap.
   8βb                      # Octal convert to binary.
      vy                    # For each...
        i        ë  }
         …rwx3*Nè           # If true, push the correct index of rwx.
                  '-        # Else push '-'.
                     J      # Repeatedly join stack inside the loop.
                      'f'-: # Repeatedly replace 'f' with '-' inside the loop.
Geno Racklin Asher
quelle
ćls8βbvyi…rwx3*Nèë'-}J'f'-:für 7 weniger ...
Magic Octopus Urn
Grundsätzlich nur eine andere Reihenfolge unter Verwendung von if-Anweisungen, und anstatt die zu entfernen, fersetze ich einfach alle fin der letzten Zeichenfolge durch -.
Magic Octopus Urn
i <CODE FOR TRUE> ë <CODE FOR FALSE> }
Magic Octopus Urn
@MagicOctopusUrn Schön!
Geno Racklin Asher
1

Python 2 , 238 Bytes

lambda m,r=str.replace,s=str.split,j="".join,b=bin,i=int,z=str.zfill,g=lambda h,y:y if int(h)else "-":r(m[0],"f","-")+j(j([g(z(s(b(i(x)),"b")[1],3)[0],"r"),g(z(s(b(i(x)),"b")[1],3)[1],"w"),g(z(s(b(i(x)),"b")[1],3)[2],"x")])for x in m[1:])

Probieren Sie es online!

Ich hatte angenommen, das wäre ein Tropfen auf den heißen Stein, aber ich habe mich geirrt. Wahrscheinlich hätte man feststellen müssen, dass ein Lambda irgendwann nicht mehr die beste Idee war.

Textlich
quelle
: | zu viele eingebaute Elemente = zu lang
ASCII
1

APL + WIN, 55 Bytes

Fordert zur Eingabe einer Zeichenfolge mit vorangestelltem Kleinbuchstaben auf:

('dl-'['dlf'⍳↑t]),⎕av[46+(,⍉(3⍴2)⊤⍎¨⍕1↓t←⎕)×9⍴69 74 75]

Erläuterung:

9⍴69 74 75 create a vector of ascii character codes for rwx -46, index origin 1

1↓t←⎕ prompt for input and drop first character

,⍉(3⍴2)⊤⍎¨⍕ create a 9 element vector by concatenating the binary representation for each digit 

46+(,⍉(3⍴2)⊤⍎¨⍕1↓t←⎕)×9⍴69 74 75 multiply the two vectors and add 46

⎕av[.....] convert back from ascii code to characters, 46 being '-'

('dl-'['dlf'⍳↑t]), append first character from input swapping '-' for 'f'
Graham
quelle
1

J , 57 52 Bytes

5 Bytes gespart dank FrownyFrog!

-&.('-DLld'i.{.),[:,('-',:'rwx'){"0 1&.|:~1#:@}."."0

Probieren Sie es online!

Noch eine lange Lösung ... Ich weiß nicht, wie man mit }stillschweigenden Verben arbeitet, und deshalb habe ich die viel länger verwendet{"0 1&.|: für die Auswahl verwendet.

Erläuterung:

@}. Lassen Sie das erste Symbol und los

,.&.": wandle den Rest in eine Liste von Nachkommastellen um

]:#: wandle jede Ziffer in eine Liste von Binärziffern um (und verschließe die Gabel)

('-',:'rwx') Erstellt eine 2-zeilige Tabelle und wählt mit 0 aus der ersten Zeile / 1 - aus der zweiten Zeile

   '-',:'rwx'
---
rwx

{"0 1&.|:~ Verwendet die Binärziffern, um aus der obigen Tabelle auszuwählen

[:, verflacht das Ergebnis

('d-l'{~'DFL'i.{.) formatiert das erste Symbol

, Hängt das fisrt-Symbol an die Liste der Berechtigungen an

Galen Ivanov
quelle
1
Die Eingabe ist bereits eine Zeichenfolge, die Sie benötigen1#:@}."."0
FrownyFrog
1
Dies scheint zu funktionieren: ('d-l'{~'DFL'i.{.)-&.('-DLld'i.{.)
FrownyFrog
@FrownyFrog Sehr gute Verwendung i.und &.vielen Dank! Können Sie mir übrigens erklären, wie man select }in stillschweigenden Verben verwendet?
Galen Ivanov
1
2 2 2&#:`('-',:'rwx'"_)}@"."0@}.ist genau die gleiche Länge
FrownyFrog
Allerdings bricht es nicht auf 333:)
FrownyFrog
1

PHP, 68 Bytes

<?=strtr(strtr($argn,[f=>_,___,__x,_w_,_wx,r__,r_x,rw_,rwx]),_,"-");

Wird fin Kleinbuchstaben in einen Unterstrich und jede Oktalzahl in einen rwxentsprechenden Wert übersetzt. Dabei werden Unterstriche anstelle von Bindestrichen verwendet (um Anführungszeichen zu vermeiden). Anschließend wird der Wert _durch ersetzt- .

Als Rohr mit laufen lassen -nF oder probieren Sie es online aus .

Titus
quelle
1

C (gcc) , 109 104 Bytes

Mindestens C kann Oktaleingaben konvertieren .... :-)

Bearbeiten: Ich habe festgestellt, dass der Größenmodifikator nicht unbedingt erforderlich ist, und das putchar()ist kürzer als printf()in diesem Fall!

f(a,b){char*s="-xwr";scanf("%c%o",&a,&b);putchar(a-70?a:*s);for(a=9;~--a;putchar(s[(1&b>>a)*(a%3+1)]));}

Probieren Sie es online!

Original:

f(a,b){char*s="-xwr";scanf("%c%3o",&a,&b);putchar(a-70?a:*s);for(a=9;~--a;printf("%c",s[(1&b>>a)*(a%3+1)]));}

Probieren Sie es online!

ErikF
quelle