Comande e use o resultado para executar outro comando

2

Eu quero transformar ls e cd em primeiro ou segundo diretório, qualquer que seja o primeiro nome ou o segundo ( dir1 ou dir2 , nesse caso):

$ ls { + some command like | grep which would get me to dir1 or dir2 or any other dir I want to }
dir1 dir2 dir3 dir4

É possível?

UPDATE :

Eu quero fazer isso no terminal sem criar um script externo.

    
por Alan Coromano 16.08.2013 / 13:44

5 respostas

3
ls | head -n 1 && cd "$(ls | head -n 1)"

fará o trabalho do primeiro diretório. Para o segundo diretório, use:

ls | awk 'NR==2' && cd "$(ls | awk 'NR==2')"

Para o diretório n-th, você pode usar:

ls | awk 'NR==n' && cd "$(ls | awk 'NR==n')" #change n with the wished line number.
    
por Radu Rădeanu 16.08.2013 / 14:24
2

Eu faria

alias cd1='cd "$(printf %s\n */ | sed q)"'
alias cd2='cd "$(printf %s\n */ | sed -n 2p\;2q)"'

e similares, mas você pode ter problemas se não houver um ou dois subdiretórios.

    
por enzotib 16.08.2013 / 15:55
1

Eu acabei de inventar isso:

#!/bin/bash

dir_counter=0

for i in *; do
    echo "Checking "$i"";
    if [ -d "$i" ]; then
        echo "$i is a directory"
        let dir_counter=dir_counter+1
        if [[ "$dir_counter" == 2 ]]; then
            cd "$i"
            #inside of $i now
            #do whatever you like
            pwd
            exit 0
        fi
    else
        echo "$i is NOT a directory"
    fi
done

Eu não sei se é a melhor maneira de conseguir o que você quer.

Uso:

alex@MaD-pc:~$ ls
a                  Desktop    Downloads  gsettings_source  nitroshare  Qt             Templates  Wallch.DEB.Build
annoying_file.txt  Documents  Dropbox    Music             Pictures    second_dir.sh  Videos
alex@MaD-pc:~$ ./second_dir.sh 
Checking a
a is a directory
Checking annoying_file.txt
annoying_file.txt is NOT a directory
Checking Desktop
Desktop is a directory
/home/alex/Desktop
alex@MaD-pc:~$

O script será apenas cd no segundo diretório que ele encontrará. Apenas tenha em mente que isso não funcionará para diretórios ocultos.

    
por hytromo 16.08.2013 / 13:52
1

Eu escrevi alguns roteiros para você, mas esta não é uma resposta completa para a sua pergunta, mas tenho certeza que irá ajudá-lo. Eu posso listar seu primeiro diretório com o meu comando.

ls | head -n 1 |awk '{print  }'

Não sei como mudar para o diretório. Tomei o seu exemplo.

jai@frank-Jai:~/sandbox$ ls | head -n 1 |awk '{print  }'
dir1
jai@frank-Jai:~/sandbox$ ls | head -n 2 |awk '{print  }'
dir1
dir2
jai@frank-Jai:~/sandbox$ 

podemos listar quantos diretórios quisermos.

    
por rɑːdʒɑ 16.08.2013 / 14:07
1

Estou um pouco inseguro quanto ao que você quer realmente, mas interpreto sua pergunta como querendo um 'one-liner' que captura uma lista de diretórios em $HOME , por exemplo, e então permite que você grave para o primeiro ou segundo diretório nessa lista, ou qualquer um deles para esse assunto.

Isso eu acho possível se você colocar todos os diretórios em um array e então você pode cd para qualquer diretório nesse array, usando, por exemplo, cd "${cdarray[1]}" , o que realmente levaria você para o diretório segundo na lista, porque as matrizes Bash sempre começam em 0, portanto, o índice 0 na matriz é, na verdade, o primeiro diretório.

Aqui está o one-liner que eu criei e que você pode usar; modificá-lo para atender às suas finalidades. Eu excluo diretórios da lista que são, na verdade, links simbólicos ( [[ ! -L "$d" ]] ). Você pode remover este teste se precisar incluí-lo e apenas manter o teste para o diretório.

Este é um exemplo para o diretório $HOME e eu adicionei $HOME ao comando, então os caminhos agora são absolutos, então você poderá executar cd "${cdarray[1]}" posteriormente como um comando separado de qualquer local e vai funcionar. Se você criá-lo para outro diretório, basta especificar o caminho absoluto em vez de $HOME no comando abaixo, a menos que você queira que ele funcione apenas em relação ao diretório no qual ele foi criado.

cdarray=(); for d in *; do [[ ! -L "$HOME/$d" && -d "$HOME/$d" ]] && cdarray+=("$HOME/$d"); done; cd "${cdarray[1]}"

Agora, todos os diretórios com espaços em seus nomes serão manipulados com êxito.

A matriz indexada é declarada e, em seguida, se o item encontrado for um diretório e não um link simbólico, ele será adicionado à matriz e, após o ponto-e-vírgula, seremos enviados para o diretório desejado, por exemplo, cd "${cdarray[1]}" .

Você poderia adicionar || exit 1 no final se você usasse isso em um script, mas eu não adicionei isso acima, pois ele fecharia o terminal interativo se o comando cd falhasse.

    
por user76204 16.08.2013 / 19:41