Eu tenho um diretório users
cheio de pastas nomeadas para cada usuário. Dentro dessas pastas, há um arquivo chamado userinfo.csv
que eu gostaria de retirar da pasta e colocá-lo no arquivo users
. Como todo arquivo na pasta do usuário é chamado userInfo, quero renomeá-lo para incluir o nome de usuário que está na pasta. Tentei o seguinte, mas não funciona porque o nome de usuário $dir
é o diretório completo. Não estou tão interessado em renomeá-lo para o nome de usuário, só preciso renomeá-lo para algo para que, quando ele for transferido, users
não fique com apenas um arquivo e um monte de erros.
Como posso melhorar isso?
# 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
Responder1
Se você não precisar do nome de usuário no nome do arquivo final,
for i in /path/to/users/*/userinfo.csv ; do
mv $i /path/to/users/userinfo-$RANDOM.csv
done
fazer o truque para o seu caso de uso?
Caso contrário, você também pode usar a substituição de parâmetros do bash:
for i in /path/to/users/*/userinfo.csv ; do
mv $i /path/to/users/${i//\/-}
done
Isso substituirá tudo /
na -
variável $i
(caminho + nome do arquivo). Então você terminará com, por exemplo:
/path/to/users/path-to-users-john-userinfo.csv
/path/to/users/path-to-users-jack-userinfo.csv
Responder2
for i in $(ls -1 /path/to/users/); do
mv /path/to/users/$i/*/userinfo.csv /path/to/users/userinfo_$i.csv
done
Isso funcionará assumindo que o userinfo.csv
local seja /path/to/users/$user/userinfo.csv
. Nos casos em que /path/to/users/
contém pastas sem userinfo.csv
ou apenas arquivos, mv
não fará nada e portanto poderá ser ignorado.
Neste $i
caso, conterá o nome de cada item, /path/to/users/
seja um arquivo ou uma pasta.