Classifique os arquivos com uma extensão específica por hora modificada e armazene-os em uma matriz

2

Eu encontrei muitas respostas para classificar os arquivos do diretório e até salvá-los em uma matriz.

Exemplo de classificação

ls -t 

Lista de diretórios na matriz

array=(*)

Meu problema específico precisa classificar arquivos com uma extensão específica (digamos *.sh ) com base na data / hora de modificação e salvar todos esses arquivos ordenados em array para serem usados posteriormente para edição ou excluindo o arquivo.

Por exemplo, depois de ter os arquivos classificados na matriz, eu poderia executar a remoção do arquivo mais recente pelo seguinte comando.

rm ${array[0]} 
    
por Osaid 06.07.2015 / 14:33

2 respostas

1

Em zsh é tão fácil quanto

array=(*.sh(Nom))

O qualificador de glob om faz com que as correspondências sejam classificadas por tempo de modificação (mais recente primeiro), e N força a matriz a ficar vazia se não houver correspondência (em vez de causar um erro).

Em outros shells como o bash, não há uma boa maneira de classificar pelo tempo. Você pode usar ls -t , mas isso pode ser interrompido porque a saída é ambígua. Se você sabe que seus nomes de arquivos contêm apenas caracteres que ls considera imprimíveis e que não são espaços em branco ou \[*? , você pode usar uma substituição de comando:

array=($(ls -t -- *.sh 2>/dev/null))

Você pode tornar isso mais robusto protegendo caracteres curinga e espaço em branco horizontal, mas novas linhas e caracteres não imprimíveis continuam sendo um problema.

IFS=$'\n'; set -f
array=($(ls -t -- *.sh 2>/dev/null))
unset IFS; set +f

Exceto em zsh, não se esqueça das aspas duplas ao se referir ao valor de uma variável, bem como -- para proteger arquivos cujo nome começa com um traço e seriam interpretados como opções, por exemplo rm -- "${array[0]}"

    
por 07.07.2015 / 01:16
1

Para fazer isso com ls robustamente, você deve não dividir em nada além do delimitador de caminho - é para isso.

IFS=/; set -f
set -- $(ls -dt ./*)
shift

Isso classificará todos os arquivos não pontilhados no diretório atual e colocará os resultados na matriz de shell $@ . Dado um POSIX ls , isso não é suscetível a qualquer tipo de mutilamento de nome de arquivo: caracteres especiais de todos os tipos - incluindo novas linhas - persistem nos resultados delimitados. Cada um (mas o último) , no entanto, terá um . ponto extra acrescentado ao nome. Se você quisesse colocar os resultados em uma matriz mais permanente, poderia lidar com os trabalhos juntos, como:

a=()
until [ -z "$2" ] &&
      a+="$1" && shift
do    a+="${1%?}"
shift;done

Não importa em que tipo de blogs sem sentido alguns outros podem vinculá-lo, você pode manipular os resultados do ls de forma robusta se souber exatamente o que procurar.

    
por 07.07.2015 / 01:40