Cambiar nombre y mover archivos anidados en Bash Script

Cambiar nombre y mover archivos anidados en Bash Script

Tengo un directorio userslleno de carpetas con el nombre de cada usuario. Dentro de esas carpetas, hay un archivo llamado userinfo.csvque me gustaría sacar de la carpeta y colocarlo en el archivo users. Dado que cada archivo en la carpeta del usuario se llama userInfo, quiero cambiarle el nombre para incluir el nombre de usuario que está en la carpeta. Intenté lo siguiente pero no funciona porque el nombre de usuario $dires el directorio completo. No estoy tan apegado a cambiarle el nombre al nombre de usuario, solo necesito cambiarle el nombre de alguna manera para que cuando entre usersno me quede con un solo archivo y un montón de errores.

¿Cómo puedo mejorar esto?

# for every subdirectory, copy userinfo.csv to /users and rename to avoid confusion/errors
for dir in /path/to/users/*/; do
    (
        cd "$dir" && cp userinfo.csv _$("dir").csv && cp _$("dir").csv /path/to/users/
    )
done

Respuesta1

Si no necesita el nombre de usuario en el nombre del archivo final, ¿lo haría?

for i in /path/to/users/*/userinfo.csv ; do
  mv $i /path/to/users/userinfo-$RANDOM.csv
done

¿Hacer el truco para su caso de uso?

Si no, también puedes usar la sustitución de parámetros de bash:

for i in /path/to/users/*/userinfo.csv ; do
  mv $i /path/to/users/${i//\/-}
done

Esto reemplazará todo /en -la variable $i(ruta+nombre de archivo). Entonces terminarás con, por ejemplo:

/path/to/users/path-to-users-john-userinfo.csv
/path/to/users/path-to-users-jack-userinfo.csv

Respuesta2

for i in $(ls -1 /path/to/users/); do
    mv /path/to/users/$i/*/userinfo.csv /path/to/users/userinfo_$i.csv
done

Esto funcionará suponiendo que la userinfo.csvubicación sea /path/to/users/$user/userinfo.csv. En los casos en que /path/to/users/contenga carpetas sin archivos userinfo.csvo solo con archivos, mvno hará nada y, por lo tanto, se puede ignorar.

En $ieste caso, contendrá el nombre de cada elemento, ya /path/to/users/sea un archivo o una carpeta.

información relacionada