Puncte:1

Script Bash pentru copierea fișierelor în subdirectoare numite după proprietarul fișierului

drapel cn

Trebuie să scriu un script bash care să copieze fișierele dintr-un folder în subfolderele numite după fișiere. De exemplu, există un director comun „Pentru toți”, în interior există diverse fișiere și directoare. Fișierele au nume cu numele proprietarului plus alte simboluri precum tom1, tom2, tom3,... sau scott1, scott2, scott3. Subfolderele sunt numite după proprietari: tom și scott. Trebuie să scriu un script pentru a copia toate fișierele din directorul „Pentru toți” în subfolderele respective. Acesta este scenariul meu.

#!/bin/bash
forall=/home/anastasia/Scripts
cd $forall
pentru fișier în $forall
 do
        dacă [ -d $fișier ]
          atunci
                continua
          fi
          dacă [ -e $fișier ]
          atunci
                proprietar='ls -l $fișier | grep "^-" | awk {'printează $£3'}'
                $file=$proprietar*   
                cp $file $forall/$owner
                chown $proprietar $forall/$proprietar/$fișier
        fi
Terminat

Ce este în neregulă cu scenariul meu? Nu face nimic.

Puncte:1
drapel hr

În afară de faptul că

pentru fișier în $forall

va executa bucla o singură dată, cu $file setat la director /home/anastasia/Scripts, problema fundamentală este că

proprietar='ls -l $fișier | grep "^-" | awk {'printează $£3'}'

atribuie șirul literal ls -l $fișier | grep "^-" | awk {print la variabila proprietar (și apoi încearcă să execute $£3} ca o comandă).

Probabil ați vrut ca ghilimelele exterioare să fie înlocuirea comenzii backticks (si a fi simplu 3):

proprietar=`ls -l $fișier | grep "^-" | awk {'print $3'}`

oricum ar folosi modul modern $(...) in schimb:

proprietar=$(ls -l $fișier | grep "^-" | awk {'print $3'})

Cu toate acestea, aceasta este o modalitate groaznică de a găsi proprietarul unui fișier; in schimb as recomanda

proprietar=$(stat -c %U -- „$fișier”)

În afară de asta, nu uitați să citați expansiunile variabile, deci ceva de genul (netestat):

#!/bin/bash

forall=/home/anastasia/Scripts

pentru fișierul în „$forall”/*
do
  if [ -d "$fișier" ]; atunci
    continua
  fi
  if [ -e "$fișier" ]; atunci
    proprietar=$(stat -c %U -- „$fișier”)
    cp -n „$fișier” „$forall/$proprietar”/
    chown „$owner” „$forall/$owner/$file”
  fi
Terminat

Rețineți că ar trebui să puteți elimina chown prin adăugarea de opțiuni adecvate pentru cp (poate -p pentru a păstra modul, proprietatea, marcajele de timp).

Kanarise avatar
drapel cn
Vă mulțumesc mult pentru feedback-ul valoros! Modul în care sugerați cu cp -p și proprietar=$(stat -c %U --"$fișier") este într-adevăr mai elegant. Am făcut modificările necesare și a funcționat cu un singur utilizator. O sa ma uit mai departe.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.