Eliminar subdirectorios según la información coincidente de la columna

Eliminar subdirectorios según la información coincidente de la columna

Quiero conservar sólo aquellos subdirectorios que están presentes en el directorio correspondiente del archivo CSV. La estructura del archivo se parece a esto:

100_folder/
├── folder_11
├── folder_25
├── folder_31
└── folder_41
210_folder/
├── folder_13
├── folder_23
├── folder_31
└── folder_42

Información en CSV:

Col6,Col26
100,folder_11
100,folder_13
100,folder_41
210,folder_31
210,folder_42

Según la información de las columnas, quiero eliminar los subdirectorios que no están presentes en el archivo CSV.

Así es como leo el archivo:

eCollection=( $(cut -d ',' -f6,26 file.csv ) )
echo "${eCollection[@]}"

Respuesta1

Por supuesto que podemos ofrecerle una solución. ¿Pero dónde está la diversión?

Permítame decirle que sus requisitos me parecen peligrosos, ya que se eliminarán todas las carpetas que no estén en csv (imagínese un error tipográfico, un formato de archivo/final de línea incorrecto o espacios en blanco al final).

Dicho esto, presentaré a tres amigos del procesamiento de archivos de texto en Shell (script).

  • manipulación de cadenas (de variables)
  • grepbúsqueda de texto core-util (contenido del archivo, solo lectura)
  • findbúsqueda de archivos core-util (nombre de archivo)

¡Nunca uses código que no entiendas completamente!

#!/bin/sh

csvfile='index.txt'
csvseparator=','

cut -d ',' -f6,26 file.csv > index.txt

for subdir in ./*/*/
  do
    subdir=${subdir%/}
    dir=${subdir%/*}
    parent=${dir%/*}
    subdir=${subdir##*/}
    dir=${dir##*/}
    if grep -Fxq "${dir%_*}$csvseparator$subdir" "$csvfile"
      then
        echo "ok: $parent/$dir/$subdir"
      elif grep -wq "^${dir%_*}" "$csvfile"
        then
          echo "no: $parent/$dir/$subdir"
#          find "$parent/$dir/$subdir" -delete
    fi
done

información relacionada