
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)
grep
búsqueda de texto core-util (contenido del archivo, solo lectura)find
bú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