Estoy tratando de tomar un nombre de carpeta a través del indicador y realizar tareas como obtener el tamaño del archivo o leer líneas en los archivos en un bucle for, pero sigo recibiendo errores en las funciones aplicadas en el bucle.

Intenté usar stat y cat pero obtuve el mismo error cat/stat: test.js: No such file or directory

read -p "Please provide the folder name; " FOLDERNAME
COUNT=0
SIZE=0
EACH=0
if [ -d "$FOLDERNAME" ]
then
    FILES=$(ls $FOLDERNAME )
    echo "checking $FOLDERNAME folder "
    for FILE in $FILES
    do
         echo "$FILE"
         echo $(cat $FILE)
        #  $(stat -c%s $FILE)
        #  echo $EACH
        #  (($SIZE=$SIZE+$EACH))
        ((COUNT++))
    done
    echo "You have $COUNT files in the $FOLDERNAME"
    # echo "$(stat $FOLDERNAME | grep Size  | tail -1  | cut -f1)"
    echo $(stat -c%s "$FOLDERNAME")
    echo "$SIZE"
else
    echo "$FOLDERNAME is does not exist"

fi

El programa se ejecuta así

Hello World!
Please provide the folder name; test
checking test folder 
test.c
cat: test.c: No such file or directory

test.css
cat: test.css: No such file or directory

test.js
cat: test.js: No such file or directory

test1.txt
cat: test1.txt: No such file or directory

test2.txt
cat: test2.txt: No such file or directory

test3.txt
cat: test3.txt: No such file or directory

You have 6 files in the test
4096
0
1
Darotudeen 23 sep. 2019 a las 21:15

1 respuesta

La mejor respuesta

Evite analizar la salida de ls. En su lugar, puede obtener nombres de archivo con un { {X1}} glob y almacenarlos en una variable de matriz:

FILES=("$FOLDERNAME"/*)
for FILE in "${FILES[@]}"; do
     echo "$FILE"
     cat "$FILE"
done
echo "You have ${#FILES[@]} files in the $FOLDERNAME"

Una matriz es buena porque conservará cualquier nombre de archivo que contenga espacios u otros caracteres especiales. También le brinda una manera fácil de contar los archivos con ${#FILES[@}} para que no necesite la variable $COUNT.

Tenga en cuenta que echo $(<command>) es una forma complicada de escribir simplemente <command>. Si va a capturar la salida de un comando solo para hacer eco de esa salida, elimine al intermediario y simplemente ejecute el comando directamente.

(Si se pregunta por qué su secuencia de comandos no funciona, es porque ls no imprime $FOLDERNAME delante de cada archivo. Simplemente imprime los nombres de los archivos sin su directorio principal. La versión global arriba no tiene ese problema.)

3
John Kugelman 23 sep. 2019 a las 18:19