Tengo un directorio users
lleno de carpetas con el nombre de cada usuario. Dentro de esas carpetas, hay un archivo llamado userinfo.csv
que 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 $dir
es 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 users
no 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.csv
ubicación sea /path/to/users/$user/userinfo.csv
. En los casos en que /path/to/users/
contenga carpetas sin archivos userinfo.csv
o solo con archivos, mv
no hará nada y, por lo tanto, se puede ignorar.
En $i
este caso, contendrá el nombre de cada elemento, ya /path/to/users/
sea un archivo o una carpeta.