Mostra uma lista de todos os nomes de arquivos em um diretório com os últimos 5 caracteres removidos de cada

2

Eu tenho um diretório que contém arquivos com nomes,

00004.time, 00010.time, ...

Não há padrão, exceto o formato,

<5 decimal digits>.time

Eu gostaria de enviar para um arquivo, apenas os números em ordem crescente. Como posso fazer isso a partir da linha de comando ou com script?

    
por user55476 02.05.2015 / 00:47

4 respostas

3

No bash shell, você pode remover uma 'extensão de ponto' (padrão de trailing mais curto correspondente a um período seguido por qualquer número de caracteres) de uma variável que contém um nome de arquivo usando expansão de parâmetro se f=00004.time , em seguida, ${f%.*} for avaliado como 00004 .

Colocando isso em um loop sobre um shell glob,

for f in *.time; do printf '%s\n' "${f%.*}"; done

A ordem será determinada pela expansão glob ( *.time ) e será a ordem de intercalação padrão para sua localidade - que deve ser ascendente numérica para a entrada mostrada. Para enviar os resultados para um arquivo, use o redirecionamento de shell

for f in *.time; do printf '%s\n' "${f%.*}"; done > somefile

Se você realmente quiser remover os últimos 5 caracteres em vez da extensão de ponto (mais geral), você pode modificar isso para

for f in *.time; do printf '%s\n' "${f%?????}"; done > somefile
    
por steeldriver 02.05.2015 / 00:58
2

Além da resposta da steeldriver , como a substring a ser excluída é a mesma para todos os arquivos, você pode usar a operação de substituição da expansão do parâmetro bash :

for file in *.time; do echo "${file/.time/}"; done | sort -n > file.txt

Isso substituirá .time pela string vazia, ou seja, .time será excluído dos nomes dos arquivos.

A sintaxe para a operação de substituição é

${Parameter/OLD/NEW}

Isso substituirá apenas a primeira ocorrência de OLD por NEW , se você quiser que toda a ocorrência de OLD seja substituída por NEW :

${Parameter//OLD/NEW}
    
por heemayl 02.05.2015 / 01:10
1

Então, você quer apenas números e não deseja .time part. Meus dois centavos aqui:

ls /path/to/*.time | cut -d '.' -f1  > toSomeFile.txt
    
por Sergiy Kolodyazhnyy 02.05.2015 / 18:16
0

Faça o mesmo por combinação de encontre e basename como comandos segue:

find /path/to/dir -name '*.time' -exec basename {} .time \; > someFile

O basename {} .time , retira o sufixo ".time" do fileNames.
O {} representa o atual fileName encontrado.

    
por αғsнιη 02.05.2015 / 20:45