|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Padova
Messaggi: 4245
|
Copiare i file solo dell'utente o gruppo.......
Ciao a tutti, ho un problemino da risolvere e awk purtroppo non mi è venuto in aiuto
Ho una directory con 69000 file misti e dovrei riuscire a copiare in un'altra directory solo i file del gruppo users tralasciando tutti gli altri. I file sono molti e per poterli gestire ho dovuto creare uno script con un ciclo for altrimenti qualsiasi comando si dia il sistema mi dice Lista degli argomenti troppo lunga. Ho provato a smistare il traffico con awk , però sembra che l'output di ls -l non sia compatibile con questo comando. Grazie. Ciao. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 1944
|
awk bisogna conoscerlo, ma è spaventoso
comunque, nel tuo caso con Codice:
ls -lah | awk '$4~/root/' drwxr-xr-x 4 root root 4,0K 10 set 13:07 .. -rw-r--r-- 1 root root 231 25 apr 08:56 .asoundrc -rw-r--r-- 1 root root 42K 30 apr 10:46 .config $3 è il campo dell'utente $4 è il campo del gruppo $9 è il file. Quindi, se ad esempio voglio copiare tutti i file di root presenti nella mia home in /root, faccio così: Codice:
cp `ls -lah | awk '$4~/root/ {print $9}' | tr "\n" " "` /root
__________________
"Oggi è una di quelle giornate in cui il sole sorge veramente per umiliarti" Chuck Palahniuk Io c'ero |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 1944
|
Quote:
Codice:
for i in `ls -lah | awk '$4~/root/ {print $9}' | tr "\n" " "`; do
__________________
"Oggi è una di quelle giornate in cui il sole sorge veramente per umiliarti" Chuck Palahniuk Io c'ero |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Padova
Messaggi: 4245
|
In maniera un po' meno raffinata, avevo fatto una cosa simile, solo che non funziona, ma nemmeno la tua versione funziona.
Allora ho provato a lanciare il comando ls -lah | awk '$4~/root/' su una directory qualsiasi direttamente dalla riga di comando ed ho scoperto che sulla gentoo funziona, mentre sulla debian testing dove ho la directory con i file da elaborare non funziona Sulla debian, una volta lanciato il comando mi da una serie di righe vuote e basta; praticamente vedo il prompt che scappa via come se qualcuno stesse pigiando il tasto invio e poi mi ritorna il prompt. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 1944
|
Si, credo che sia la versione di awk.
Devi aggiungere un'azione al pattern matching. ls -lah | $4~/root/ awk {print $0} dovrebbe andare. Al posto di $0 (tutta la linea) puoi printare $3 (utente) $4 (gruppo) $9 (filename) e anche gli altri, ovviamente. Per capire chi è $x basta che vedi l'output di quello che passi a awk. Lui divide tutto per caratteri "bianchi": quindi in Claudio 23 Roma Claudia 25 Firenze Andrea 55 Modica $1 è il nome $2 è l'età $3 è la città Se mando un file con quella roba in awk '{print $3}' stampa solo la città ma di tutti Se mando lo stesso file in awk '$1~/Claud/ {print $3}' stampa solo la città e solo di quelli che hanno il campo $1 (nome) che matcha con "Claud" e qualunque cosa prima o dopo. Puoi anche modificare il separatore con cui awk processa il file, ma credo non ti serva.
__________________
"Oggi è una di quelle giornate in cui il sole sorge veramente per umiliarti" Chuck Palahniuk Io c'ero |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
In alternativa puoi usare find in questo modo:
Codice:
find . -type f -group user -exec cp {} /destinazione \;
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Padova
Messaggi: 4245
|
Quote:
Ora, visto che ti vedo esperto di awk, volevo farti un'altra domanda, solo per curiosità perchè alla fine ho risolto lo stesso ma prendendo un giro più largo Allora, con il primo script che mi hai consigliato ho estrapolato dai 69000 file tutti quelli che facevano parte del gruppo "users" e sono arrivato ad un totale di 22.093 file. A questo punto avevo la necessità di fare un'ulteriore sgrezzatura di quei 22.093 file estraendo solo tutti i file di agosto e settembre. Ho provato modificando lo script in questo modo: Codice:
for i in 'ls -lah | awk '$7=="set" {print $9}' | tr "\n" " "`; do
cp -Rpv /dati/salva/$i /dati/settembre;
done
Però se sostituisco la riga cp -Rpv /dati/salva/$i /dati/settembre; con un semplice echo $i vedo (giustamente) a video solo la lista dei file di settembre? Spero di essermi spiegato Scusa se non sono molto chiaro, ma devo scappare a letto, ho le palpebre molto pesanti Grazie. Ultima modifica di stefanoxjx : 16-09-2006 alle 23:20. |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Padova
Messaggi: 4245
|
Quote:
La devo provare |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 1944
|
Quote:
__________________
"Oggi è una di quelle giornate in cui il sole sorge veramente per umiliarti" Chuck Palahniuk Io c'ero |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Sep 2001
Città: Roma
Messaggi: 1944
|
Quote:
Il == è una cosa da linguaggio di programmazione e vuol dire "esattamente uguale". awk ha un pattern matching potentissimo ma con le espressioni regolari (un'espressione regolare è limitata da / e /). Quindi,meglio usare l'operatore ~ che sembra più adatto alla situazione: Codice:
for i in 'ls -lah | awk '$7~/set/ {print $9}' | tr "\n" " "`; do
cp -Rpv /dati/salva/$i /dati/settembre;
done
Codice:
for i in 'ls -lah | awk '{ if ($7=="set") print $9}' | tr "\n" " "`; do
cp -Rpv /dati/salva/$i /dati/settembre;
done
Codice:
for i in 'ls -lah | awk '$7~/set/ {print $9}' | tr "\n" " "`; do
cp -Rpv /dati/salva/"$i" /dati/settembre;
done
__________________
"Oggi è una di quelle giornate in cui il sole sorge veramente per umiliarti" Chuck Palahniuk Io c'ero |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:53.



















