Bash Script Extrair nome de arquivo de ls -l Resultados

0

Eu tenho um Bash Script que se destina a localizar arquivos criados em uma data específica. Está funcionando como abaixo.

#!/bin/bash

LOCATION="/tmp/testfiles"
DATE="Jan 10"
COMMAND="ls -l ${LOCATION} | grep '${DATE}'"

for FILE in 'eval $COMMAND'
do
    echo $FILE
done

Está localizando o arquivo que eu espero que ele

-rw-rw-rw- 1 root root  9485 Jan 10 10:00 test01.log

Mas o bash for loop está circulando por todos os campos do comando ls -l, então estou terminando com

-rw-rw-rw-
1
root
root
9485
Jan
10
10:00
test01.log

Qual eu não quero. É possível extrair o nome do arquivo de um comando ls -l para evitar que o loop processe todos os campos.

Eu não posso usar apenas ls neste caso, porque eu preciso saber a data para que o grep funcione.

PS. Eu sei que não é recomendado armazenar comandos em variáveis, mas eu preciso disso assim por agora, eu provavelmente vou mudar isso em um estágio posterior.

    
por TheLovelySausage 17.01.2018 / 12:24

3 respostas

3

isso deve imprimir todos os caminhos dos arquivos modificados entre as datas indicadas:

find . -type f -newermt '2018-01-17' ! -newermt '2018-01-18'

que deve funcionar quando usado em seu script, desde que nenhum dos nomes de arquivo contenha espaço, tabulação, nova linha e caracteres curinga (e você não modificou $IFS ):

FILES=$(find /your/path -type f -newermt '2018-01-17' ! -newermt '2018-01-18')

for file in $FILES; do
    echo "${file}"
done 

imprimirá os caminhos e não apenas os nomes dos arquivos.

dependendo do que você deseja fazer com esses arquivos, considere também executar os comandos nos arquivos diretamente com find -exec command .

    
por 17.01.2018 / 12:34
2

Usar a saída de qualquer forma do comando ls em scripts de shell é quase totalmente desencorajado. Mesmo se você usasse ls -1 (que é um número, "um") em vez de ls -l , você teria que lidar com nomes de arquivos contendo espaços incorporados, etc.

Em vez disso, use o comando find , com a opção -print0 para impressão segura e com a opção -ctime para limitar a um tempo de criação de arquivo específico.

    
por 17.01.2018 / 12:32
2

Para executar esta tarefa com segurança, você não deve analisar ls e deve evitar usar eval sempre que possível. Nesta sugestão eu também protegi o código contra espaços e caracteres estranhos nos nomes dos arquivos:

date="Jan 10 2017"
find -type f -newermt "$date" \! -newermt "$date + 1 day" -printf '%P
date="Jan 10 2017"
find -type f -newermt "$date" \! -newermt "$date + 1 day" -printf '%P%pre%' |
    while IFS= read -r -d $'%pre%0' f;
    do
        echo ">> $f <<"
    done
' | while IFS= read -r -d $'%pre%0' f; do echo ">> $f <<" done

Se você quer apenas capturar o nome do arquivo, não precisa do loop while read e também pode usar find ... -printf "%P" sem o %code% .

    
por 17.01.2018 / 13:12