Renomear + mover arquivos aninhados no script Bash

Renomear + mover arquivos aninhados no script Bash

Eu tenho um diretório userscheio de pastas nomeadas para cada usuário. Dentro dessas pastas, há um arquivo chamado userinfo.csvque 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, usersnã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.csvlocal seja /path/to/users/$user/userinfo.csv. Nos casos em que /path/to/users/contém pastas sem userinfo.csvou apenas arquivos, mvnão fará nada e portanto poderá ser ignorado.

Neste $icaso, conterá o nome de cada item, /path/to/users/seja um arquivo ou uma pasta.

informação relacionada