Eu preciso de um comando para renomear todos os arquivos no diretório de trabalho atual, de forma que o novo nome do arquivo seja o mesmo do antigo, mas incluindo um sufixo correspondente ao número de linhas dos arquivos originais (por exemplo, se o arquivo f
tiver 10 linhas, em seguida, ele deve ser renomeado para f_10
).
Aqui está minha tentativa (que não funciona):
linenum=$(wc -l); find * -type f | grep -v sh | rename 's/^/ec/'*
bash
batch-rename
Martin Yeboah
fonte
fonte
Respostas:
E se:
Por exemplo:
Se você deseja manter as extensões (se houver), use isso:
fonte
_
. Quanto ao script, qual script? Isso deve ser executado na linha de comando, não há necessidade de um script. Se você deseja que ele corresponda apenas a alguns arquivos, alterein *
para, por exemplo,in *txt
ou algo assim.wc -l < $f
invés do grep seria mais fácil entender (e talvez seja melhor executar, mas eu não verifiquei isso).wc
, eu queria mostrar uma abordagem diferente. Mas tudo bem, é justo.Você pode tentar este forro:
Isso encontrará todos os arquivos no diretório de trabalho atual (
find . -maxdepth 1 -type f
)Em seguida, estamos executando uma instância do shell sobre os arquivos encontrados para renomear os arquivos para acrescentar o número de linhas.
Exemplo:
fonte
Outra maneira que preserva a extensão (se presente) usando
rename
:Se o resultado for o esperado, remova a
-n
opção:fonte
rename
Ótimo =) +1(\.?[^\.]+)
.(\.?[^\.]+)
também não está ok porque corresponderá apenas até o segundo ponto e não corresponderá a um nome de arquivo com pontos consecutivos ou terminará com um ponto independentemente. Não é uma solução fácil, difícil, a única maneira parece fazer duas substituições..
classes de personagens.Usando
find
:Exemplo
fonte
-name "*"
? Sobras dos testes? ;)Apenas por diversão e ri de uma solução com
rename
. Comorename
é uma ferramenta Perl que aceita uma sequência arbitrária que é avaliada, você pode fazer todo tipo de travessuras. Uma solução que parece funcionar é a seguinte:fonte
O script abaixo abrange vários casos: o único ponto e extensão (arquivo.txt), vários pontos e extensões (arquivo.1.txt), pontos consecutivos (arquivo..foobar.txt) e pontos no nome do arquivo (arquivo. Ou Arquivo..).
O Script
Script em ação
Observe que não há linhas no arquivo. e arquivo .., portanto, a contagem de linhas é 0
Agradecimentos especiais a Terdon e Helio pela revisão do script e edições sugeridas
fonte
Outra maneira bash, desenvolvida com @Helio no chat :
O cara monocular de aparência estranha com uma segunda cabeça atrofiada (
(.*)(\.[^.]+)$
) deve corresponder apenas a extensões apropriadas (.foo
, não..
). Se não houver extensão, aBASH_REMATCH
matriz estará vazia. Podemos tirar vantagem disso usando um valor padrão para o nome do arquivo${BASH_REMATCH[1]:-$file}
e apenas usando a extensão como está.Para lidar com arquivos de ponto, você pode usar
find
, conforme sugerido por terdon e Helio .fonte