bash - sintaxis - comandos linux
muestra el contenido de todos los archivos con sus nombres de archivo con cat (6)
Esto fue discutido recientemente en Hacker News a través de la publicación del blog 4 comandos de UNIX que uso todos los días .
Lo esencial era usar esto:
more * | cat
Para obtener esto:
::::::::::::::
jack.txt
::::::::::::::
Once upon a time
there was a fellow named Jack.
::::::::::::::
lyingryan.txt
::::::::::::::
Now that "trickle down economics" has been
tested for 30 years and the data shows it
has been a total failure, candidates
still claim that cutting taxes for
billionaires will help the economy.
::::::::::::::
market.txt
:::::::::::::::
Jack went to market to sell the family
cow.
He came back with a handful of magic beans.
Que es mucho más bonito que un bucle for ... do ... done
.
La publicación del blog también menciona muchas alternativas a este enfoque para que sea compatible con diferentes unidades, como head -n 99999 *
comparación con head -n 0 *
que solo funciona en Linux.
Esta pregunta ya tiene una respuesta aquí:
No puedo encontrar una manera de imprimir cada nombre de archivo antes de su contenido con cat
. Esto es lo que estoy tratando de hacer:
raja@badfox:~/Perl/t$ ls
1.txt 2.txt 3.txt
raja@badfox:~/Perl/t$ echo " I am " >> 1.txt
raja@badfox:~/Perl/t$ echo " trying " >> 2.txt
raja@badfox:~/Perl/t$ echo " to do this " >> 3.txt
raja@badfox:~/Perl/t$ cat *.*
I am
trying
to do this
raja@badfox:~/Perl/t$
En el último comando solo obtuve el texto de esos archivos, pero en realidad quiero el texto junto con los nombres de los archivos. Me refiero a esto
Filename:1.txt
<Data in the file>
Filename:2.txt
<Data in that file>
Filename:3.txt
<Data in that file >
Se puede lograr, por ejemplo, con
ls -1 *.txt | xargs -I % sh -c "echo % ; cat %"
simplemente:
- para cada archivo
.txt
- ejecute el comando
echo filename ; cat filename
echo filename ; cat filename
(el%
es un patrón de reemplazo definido por-I
)
También puedes abusar de grep un poco logrando que:
grep -r ''.*'' *.txt
Para obtener números de línea puede
grep -rn ''.*'' *.txt
Por encima de grep solo se busca cualquier cosa. En caso de que no esté interesado en líneas vacías, incluso puede haber simplificado:
grep -r . *txt
Además, el interruptor -r grep hace que grep se ejecute de forma recursiva, por lo que puedes
grep -r . .
para listar el contenido de todos los archivos en sus directorios actuales.
[EDITAR] Aspecto negativo: es lento, por lo que para una gran cantidad de archivos no lo usaría.
cat
no imprime los nombres de los archivos. O haga que el shell lo haga o use head
o tail
: imprimen el nombre del archivo cuando pasa varios archivos (no exactamente en el mismo formato). Use tail -n +1
para imprimir el archivo completo (comenzando en la línea 1, las líneas están numeradas desde 1).
tail -n +1 -- *.txt
$ for f in *; do echo "Filename: $f"; cat "$f"; done
Filename: 1.txt
I am
Filename: 2.txt
trying
Filename: 3.txt
to do this
find . -name /*.txt -print -exec cat {} /;