Necesito escribir un script para ordenar los nombres de archivo por el carácter que viene después del primer "0" en el nombre. Todos los nombres de archivo contienen al menos un 0. Luego, el script debe imprimir el contenido de cada archivo en ese orden.

Sé que necesito usar sort y cat. Pero no puedo entender de qué tipo. Esto es lo más lejos que tengo.


#!/bin/bash

dir=$(pwd)


for n in $dir `ls | sort -u `  ; do

    cat $n
done;
-2
user10336290 9 sep. 2018 a las 04:12

3 respuestas

La mejor respuesta
dir=$(pwd)

for n in `ls -1 $dir | sort -t0 -k2`; do
   cat $n
done;
-3
Murli 9 sep. 2018 a las 01:39

Podrías escribir un script que se vea así:

#/bin/bash

# using "shopt -s nullglob" so that an empty directory won't give you a literal '*'.
shopt -s nullglob

# get a sorted directory listing
filelist=$(for i in .*0* *0*; do echo "$i"; done | sort -t0 -k2)

IFS=$(echo -en "\n\b")
# iterate over your sorted list
for f in $filelist
do
        # just cat text files.
        file $f | grep text > /dev/null 2>&1
        if [ $? = 0 ]
        then
                cat $f
        fi
done

Prueba:

[plankton@localhost SO_scripts]$ ls -l
total 40
-rw-r--r-- 1 plankton plankton  10 Sep  9 10:56 afile0zzz
-rw-r--r-- 1 plankton plankton  14 Sep  9 10:56 bfile xxx0yyy
-rwxr-xr-x 1 plankton plankton 488 Sep  9 10:56 catfiles.sh
-rw-r--r-- 1 plankton plankton   9 Sep  9 10:56 file0123
-rw-r--r-- 1 plankton plankton   9 Sep  9 10:56 file0124
-rw-r--r-- 1 plankton plankton   7 Sep  9 10:56 file0a
-rw-r--r-- 1 plankton plankton   8 Sep  9 10:56 file0aa
-rw-r--r-- 1 plankton plankton   7 Sep  9 10:56 file0b
-rw-r--r-- 1 plankton plankton   9 Sep  9 10:56 file0bbb
-rw-r--r-- 1 plankton plankton  18 Sep  9 10:56 files*_0asdf
[plankton@localhost SO_scripts]$ ./catfiles.sh
. is not a text file
.. is not a text file
Doing catfiles.sh
#/bin/bash

# using "shopt -s nullglob" so that an empty directory won't give you a literal '*'.
shopt -s nullglob

# get a sorted directory listing

filelist=$(for i in .* *; do echo "$i"; done | sort -t0 -k2)

IFS=$(echo -en "\n\b")
# iterate over your sorted list
for f in $(for i in .* *; do echo "$i"; done | sort -t0 -k2)
do
        # just cat text files.
        file $f | grep text > /dev/null 2>&1
        if [ $? = 0 ]
        then
                echo "Doing $f"
                cat $f
        else
                echo "$f is not a text file"
        fi
done
Doing file0123
file0123
Doing file0124
file0124
Doing file0a
file0a
Doing file0aa
file0aa
Doing files*_0asdf
file with * in it
Doing file0b
file0b
Doing file0bbb
file0bbb
Doing bfile xxx0yyy
bfile xxx0yyy
Doing afile0zzz
afile0zzz

Actualizado según la sugerencia de PesaThe de .*0* *0*.

-2
Red Cricket 9 sep. 2018 a las 18:29

Eche un vistazo a este find + xargs que manejará correctamente los nombres de archivo con "personajes divertidos":

find . -maxdepth 1 -type f -name '*0*' -print0 | sort -zt0 -k2 | xargs -0 cat
0
PesaThe 9 sep. 2018 a las 19:43