Altera o diretório de trabalho do diretório para o diretório anterior no Shell Script

0

Existe alguma maneira de alcançar abaixo? Estou preso para realizar minha tarefa.

Eu escrevi o shell script que me fornece uma saída correta somente quando o script é executado no mesmo mês

abaixo é o comando que estou usando no script

cd $(find /home/application/Files/output/$(date +%Y)/$(date +%m) -type d|sort -r |head -1)

Abaixo está o formato de diretório que está presente no sistema

 /home/application/Files/output/2018/01/30

Agora, o problema é: quando executo meu script, isso me causa um erro

 find: '/home/application/Files/output/2018/02': No such file or directory

Ele está procurando pelo diretório ../2018/02 , que ainda não está criado, por isso preciso executar minha tarefa em /home/application/Files/output/2018/01/30 . Alguém pode por favor ajudar.

    
por Satya 03.02.2018 / 06:33

3 respostas

1

Por que procurar um diretório YYYY / MM / DD / que ainda não exista?

Pesquise e cd no diretório YYYY / MM / DD / mais recente:

cd "$(find /home/application/Files/output/ -type d \
       -regex '.*/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]$' -print0 | 
     sort -rVz | head -z -n 1)"

Nota: requer o GNU find , sort e head para as opções -print0 e -z NUL-delimitador.

Se você preferir expressões regulares no estilo PCRE, poderá fazer isso:

cd "$(find /home/application/Files/output/ -type d -print0 | 
        grep -z -P '/\d{4}/\d\d/\d\d$' | sort -rVz | head -z -n 1)"

Como alternativa, se você precisar usar o diretório do dia atual, esteja ele vazio ou não, crie o diretório primeiro e, em seguida, cd :

dir="/home/application/Files/output/$(date +%Y/%M/%d)"
mkdir -p "$dir"
cd "$dir"
A opção mkdir do -p cria o diretório, se ele ainda não existir. Ele também cria qualquer diretório pai necessário. Não causa um erro ou reclama se o diretório já existe.

    
por 03.02.2018 / 10:37
0

Usando o GNU date e bash (ou ksh93 ), escolhe o diretório de hoje, mas retrocede um dia de cada vez se o diretório dessa data não for encontrado, até encontrar um diretório existente (ou no máximo 30 dias de volta no tempo):

for (( i = 0; i < 30; ++i )); do
    dir="/home/application/Files/output/$( date -d "now -$i days" +'%Y/%m/%d' )"
    [ -d "$dir" ] && break
done

if [ ! -d "$dir" ]; then
    echo 'Can not find recent output directory!' >&2
    exit 1
fi

printf 'Using output directory "%s"\n' "$dir"
cd "$dir"
    
por 03.02.2018 / 08:45
0

Se os diretórios forem sempre criados no mesmo dia, ou muito próximos da mesma data, eles receberam o nome de:

cd $(find /home/application/Files/output/$(date +%Y)/ -mindepth 1 -maxdepth 1 \
  -mtime -2 -type d |sort -r |head -1)

Eu não testei. Talvez min / maxdepth precisa ser 2.:)

Esta solução requer que a data de criação tenha no máximo dois dias. Talvez você precise ajustar isso também.

Sem nova linha:

 cd $(find somepath/$(date +%Y)/ -mindepth 1 -maxdepth 1 -mtime -2 -type d |sort -r |head -1)
    
por 03.02.2018 / 07:44