[BASH] Come fare il paste di tutti i file in una cartella

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Mister80
Prode Principiante
Messaggi: 87
Iscrizione: domenica 5 giugno 2011, 16:43

[BASH] Come fare il paste di tutti i file in una cartella

Messaggio da Mister80 »

Ciao ragazzi, stavo realizzando uno script e mi chiedevo se era possibile fare il paste di tutti i file in una cartella, senza che io so ne quanti ne quali sono questi file.
grazie a tutti in anticipo per le risposte! :ciao:
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12949
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da thece »

:ciao:

cosa intendi esattamente per paste? del nome del file o del suo contenuto? E soprattutto dove? in un altro file oppure nella clipboard del tuo DE?
Mister80
Prode Principiante
Messaggi: 87
Iscrizione: domenica 5 giugno 2011, 16:43

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da Mister80 »

per paste intendo il comando, cioè l'unione dei file riga per riga (del contenuto dei file).
Devo stampare il tutto nella shell
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12949
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da thece »

Codice: Seleziona tutto

#!/bin/bash

if [[ -z "$1" ]]; then
        echo "Error: argument is empty"
        exit 1
fi

if [[ ! -d "$1" ]]; then
        echo "Error: $1 is not a directory"
        exit 1
fi

cd "$1"

for ITEM in *; do
        if [[ -f "$ITEM" ]]; then
                cat "$ITEM"
        fi
done

exit 0
Può andare?
Mister80
Prode Principiante
Messaggi: 87
Iscrizione: domenica 5 giugno 2011, 16:43

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da Mister80 »

non penso ci siamo capiti :nono:

Io ho dei file in una cartella, ma non conosco il loro nome, devo prodere tutti questi file e fare l'unione RIGA PER RIGA!
ex:

file1:

1
2
3
5

file2:

2
5
8
7
unione:

1 2
2 5
3 8
5 7

Grazie per la risposta :birra:
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12949
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da thece »

Ah ... ho capito. Si è sicuramente fattibile ... con uno script o un programmino un pò più complicato ... buon lavoro ;)
Mister80
Prode Principiante
Messaggi: 87
Iscrizione: domenica 5 giugno 2011, 16:43

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da Mister80 »

a saperlo fare..
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12949
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da thece »

Senza alcuna cattiveria, ti rispondo come in passato ho già risposto ad altri utenti in merito a questo genere di richieste: un conto è impiegare 5 / 10 minuti del proprio tempo per suggerire passaggi / soluzioni / idee, un altro conto è impiegare qualche ora per scrivere codice su commissione.

Detto questo, e premesso che non sono un programmatore Bash, per tentare di mitigare il tuo senso di abbandono, ti suggerisco una traccia di quello che io proverei a fare per risolvere il problema:

Codice: Seleziona tutto

1) fai una scansione della directory TARGET e inserisci in una lista il nome di tutti i file ivi presenti

2) crei un file di testo OUTPUT.txt vuoto

3) per ogni (nome di) file i-esimo contenuto nella lista

          3.1) per ogni riga j-esima del file OUTPUT.txt e del file i-esimo, concateni le due righe e sovrascrivi sul file OUTPUT.txt
sembrano quattro istruzioni, ma ti assicuro che non lo sono

Buon lavoro



[EDIT]

Cercando in Rete ho trovato questo comando (paste) che fa proprio quello che cerchi tu

Codice: Seleziona tutto

paste file1.txt file2.txt > fileresults.txt
si impara sempre qualcosa di nuovo

[/EDIT]
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da crap0101 »

thece [url=http://forum.ubuntu-it.org/viewtopic.php?p=4894038#p4894038][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:[...] ti suggerisco una traccia di quello che io proverei a fare per risolvere il problema:

Codice: Seleziona tutto

1) fai una scansione della directory TARGET e inserisci in una lista il nome di tutti i file ivi presenti

2) crei un file di testo OUTPUT.txt vuoto

3) per ogni (nome di) file i-esimo contenuto nella lista

          3.1) per ogni riga j-esima del file OUTPUT.txt e del file i-esimo, concateni le due righe e sovrascrivi sul file OUTPUT.txt
sembrano quattro istruzioni, ma ti assicuro che non lo sono
Infatti sono molte meno :D
[EDIT]

Cercando in Rete ho trovato questo comando (paste) che fa proprio quello che cerchi tu

Codice: Seleziona tutto

paste file1.txt file2.txt > fileresults.txt
si impara sempre qualcosa di nuovo
quello è _proprio_ il comando che Mister80 intendeva utilizzare fin dall'inizio del thread, evidentemente non ha letto il man e nemmeno la sinossi, altrimenti si sarebbe accorto che il "problema" non esiste, quello che vuole fare si fa semplicemente con

Codice: Seleziona tutto

paste *
ipotizzando di essere nella dir che interessa o aggiungendo il path a questa.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12949
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da thece »

thece [url=http://forum.ubuntu-it.org/viewtopic.php?p=4894038#p4894038][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: ... un conto è impiegare 5 / 10 minuti del proprio tempo per suggerire passaggi / soluzioni / idee, un altro conto ...
Come debito per avermi fatto scoprire una cosa nuova, mantengo la mia parola.

Lo script è un pò grezzo: potrebbe essere rifinito molto meglio, ma funziona. L'output finale viene prodotto nel file /tmp/OUTPUT.txt

pasteAllFile.sh

Codice: Seleziona tutto

#!/bin/bash



help ()
{
	cat << EOF

DESCRIPTION

   ?!?

USAGE

   pasteAllFile DIRECTORY

EOF
}



OUT_FILE="/tmp/OUTPUT.txt"
TMP_FILE="/tmp/OUTPUT.tmp"
FILE_TYPE=""


if [[ -z "$1" ]]; then
    help
    exit 1
fi

if [[ ! -d "$1" ]]; then
    help
    exit 1
fi

if [[ -e "$OUT_FILE" ]]; then
    rm "$OUT_FILE"
fi

if [[ -e "$TMP_FILE" ]]; then
    rm "$TMP_FILE"
fi

touch "$OUT_FILE"

cd "$1"

for ITEM in *; do
    if [[ -f "$ITEM" ]]; then
        FILE_TYPE=$(file -b "$ITEM")
        if [[ $FILE_TYPE == *"text"* ]]; then
            paste "$ITEM" "$OUT_FILE" > "$TMP_FILE"
        fi

        if [[ -e "$TMP_FILE" ]]; then
            mv "$TMP_FILE" "$OUT_FILE"
        fi
    fi
done

cat "$OUT_FILE"

exit 0
Ultima modifica di thece il mercoledì 29 giugno 2016, 22:14, modificato 3 volte in totale.
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da crap0101 »

@thece: no, vedi la risposta sopra... btw, lui vuole stampare su stdout
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12949
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da thece »

Basta aggiungere un

Codice: Seleziona tutto

cat /tmp/OUTPUT.txt
finale



@crap0101

Codice: Seleziona tutto

paste *
per quanto possa funzionare, mi sembra molto ardita come soluzione finale. Se i file tirati su non sono tutti file di testo ...
Vabbè, ho imparato una cosa nuova e ho fatto un pò di esercizio di scripting

:birra:
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da crap0101 »

se ci si vuole complicare la vita sì... mi chiedo solo il senso di quelle 30 righe di operazioni inutili quando bastano *due* parole.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12949
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da thece »

crap0101 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4894066#p4894066][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: se ci si vuole complicare la vita sì... mi chiedo solo il senso di quelle 30 righe di operazioni inutili quando bastano *due* parole.
"Nessuno" o "esercizio di scripting"



Che figuraccia, me lo hai anche scritto :muro: :muro: :muro:
Mister80 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4893984#p4893984][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: per paste intendo il comando, cioè l'unione dei file riga per riga (del contenuto dei file).
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da crap0101 »

thece [url=http://forum.ubuntu-it.org/viewtopic.php?p=4894062#p4894062][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:[
@crap0101

Codice: Seleziona tutto

paste *
per quanto possa funzionare, mi sembra molto ardita come soluzione finale. Se i file tirati su non sono tutti file di testo ...
Vabbè, ho imparato una cosa nuova e ho fatto un pò di esercizio di scripting

:birra:
mi ero perso questo: imho, non è una soluzione ardita, ma l'uso normale e previsto del comando; l'unico problema che effettivamente potrebbe presentarsi è se il numero di file è così elevato che supera il numero massimo di argomenti o la lunghezza limite

Codice: Seleziona tutto

crap0101@orange:/tmp/foo$ getconf ARG_MAX
2097152
per cui nel caso sia probabile - o per non correre comunque rischi - sono da valutare soluzioni alternative, però mi orienterei più verso find + xargs.

Riguardo il _tipo_ di file, mi pare che non sia un problema in questo caso specifico; btw non vedo la cosa implementata nello script che hai proposto, per cui se sei in serata da esercizi, ti direi di aggiungerla! :-)
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12949
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da thece »

crap0101 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4894091#p4894091][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: non vedo la cosa implementata nello script che hai proposto, per cui se sei in serata da esercizi, ti direi di aggiungerla! :-)
Promosso? ;)
Mister80
Prode Principiante
Messaggi: 87
Iscrizione: domenica 5 giugno 2011, 16:43

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da Mister80 »

@crap0101: grazie mille! Proprio come volevo io!
Grazie anche a @thece!
P.s ti giuro di aver guardato il manuale prima di postare la domanda però non ho trovato l'opzione con l'*
Ad ogni caso, grazie! :birra:
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da crap0101 »

ma sì :-D
però magari posta il codice modificato in un nuovo messaggio senza editare quelli vecchi, altrimenti dopo non si capisce più nulla.
btw, come test per file userei

Codice: Seleziona tutto

[[ $(file -b --mime-type  $file) =~ ^text ]]
che, imho, è più intuitivo e comodo da parsare ed eviteri il test sull'esistenza del file temporaneo se non all'inizio, piuttosto si esce con status >0 se il mv dà errore, invece di continuare "silenziosamente" anche quando alcuni dati sono andati perduti.
Ultima modifica di crap0101 il giovedì 30 giugno 2016, 0:16, modificato 1 volta in totale.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12949
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da thece »

[quote="crap0101 [img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img]"]
però magari posta il codice modificato in un nuovo messaggio senza editare quelli vecchi, altrimenti dopo non si capisce più nulla.
btw, come test per file userei

Codice: Seleziona tutto

[[ $(file -b --mime-type  $file) =~ ^text ]][(code]
che, imho, è più intuitivo e comodo da parsare ed eviteri il test sull'esistenza del file temporaneo se non all'inizio, piuttosto si esce con status >0 se il mv dà errore, invece di continuare "silenziosamente" anche quando alcuni dati sono andati perduti.[/quote]
E' free software! Puoi farlo anche tu ;)
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [BASH] Come fare il paste di tutti i file in una cartell

Messaggio da crap0101 »

Mister80 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4894157#p4894157][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:@crap0101: grazie mille! Proprio come volevo io!
Grazie anche a @thece!
P.s ti giuro di aver guardato il manuale prima di postare la domanda però non ho trovato l'opzione con l'*
Ad ogni caso, grazie! :birra:
non è un'opzione, è questo:

Codice: Seleziona tutto

SYNOPSIS
       paste [OPTION]... [FILE]...

tipico di qualunque comando, e questo nello specifico si legge: «scrivi "paste" seguito da/dalle opzioni "OPTION" seguite dal/dai file "FILE"».
Poi bè... almeno con paste non ci sono argomenti posizionali per cui puoi anche invertire o mischiare "OPTION" e "FILE", però non tutti i programmi si comportano così, per cui in genere è meglio seguire le istruzioni.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 9 ospiti