Selecionando da lista como matriz (sem nome por número)

1

Depois de eu ls e ver a lista, existe alguma maneira de processar um documento sem digitar seu nome?

Por exemplo, em vez de digitar rm damnSoLongFileName , posso digitar algo como rm [1] ?

Quero dizer, há alguma maneira de usar ls como array?

    
por zahedae 16.12.2014 / 14:46

4 respostas

3

Aqui está um folheto:

for something in $( ls );do echo $something;done

Ou usando select :

select item in $( ls );do echo $item;done

Você pode substituir echo por rm e remover o item que você selecionou. Você pode então pressionar ctrl + c para parar o loop.

Saída:

bob@bob-p7-1298c:~$ select item in $( ls );do echo $item;done
1) adifferentlikethis    6) Documents       11) initramfs       16) MESVG20.xlsx    21) out.png     26) racket      31) t~          36) Untitled        41) VMs
2) bash_speakit      7) Downloads       12) irssi_log       17) MLGVG17.xlsx    22) output.mp3      27) run.py      32) Templates       37) Document
3) color_img.jpg     8) ec2         13) likethis        18) MLRVG17.xlsx    23) php5        28) run.sh      33) test        38) 1
4) DATES         9) examples.desktop    14) lpr         19) Music       24) Pictures        29) space.txt       34) t.sh        39) Videos
5) Desktop      10) grub.iso        15) MEEVG19.xlsx    20) nano.save       25) Public      30) t           35) Untitled-2.pd   40) VirtualBox
#? 

Em seguida, eu digito um número e ele irá retornar para mim.

#? 2
bash_speakit

Outra possibilidade:

thearray=( $(ls) )
echo "${thearray[2]}"

Saída:

color_img.jpg
    
por jmunsch 16.12.2014 / 14:48
2

Você pode usar o preenchimento de guias para nomes extensos de arquivos. Para o seu exemplo, digite algo como rm damn<TAB> .

    
por henkkeli 16.12.2014 / 14:51
1

A partir do "quero dizer há alguma maneira de usar ls como array?" parte eu diria que a questão é simplesmente transmitir os resultados ls em algum outro comando, então estou respondendo com um link para Xargs e um exemplo simples de uso:

find -name '*.txt' -print0 | xargs -0 rm

Verifique man find para obter mais informações sobre como localizar, filtrar e transmitir os resultados usando o comando find e man xargs para obter um manual completo sobre xargs. O exemplo acima é um caso clássico simples de combinação de argumentos -print0 + -0 entre os dois usando pipe.

    
por Ahti Komu 16.12.2014 / 15:28
0

Sem dúvida não ortodoxa, mas se você copiar o script abaixo em um arquivo vazio, salve-o como ls_2 em ~/bin , torne-o executável e execute-o pelo comando (de qualquer lugar):

ls_2

mostrará uma lista como:

jacob@jacob-System-Product-Name:~/Bureaublad/all kinds of crap$ ls_2
1. nog te doen.odt
2. otto
3. GW_site_werkmap
4. sanel
5. blacklist.2
6. sanel_edited
7. sanel_gigue.mp3
8. Sprachmemo_011[1].m4a
9. PRG001
10. crap

please enter numbers to remove (separated by a comma): 1,3,5

Basta inserir os números e os itens (os diretórios e os arquivos) serão removidos.

Como o comando ls "real", ele pode ser executado a partir do diretório atual (apenas ls_2 ) ou com um diretório como argumento ( ls_2 /path/to/directory ).

O script:

#!/usr/bin/env python3
import os
import shutil
import sys

try:
    currdir = sys.argv[1]
except IndexError:
    currdir = os.getcwd()

items = os.listdir(currdir)
for i in range(len(items)):
    print(str(i+1)+".", items[i])

remove = input("\nplease enter numbers to remove (separated by a comma): ")
indices = [int(it) for it in remove.split(",")]
for i in indices:
    file = currdir+"/"+items[i-1]
    try:
        os.remove(file)
    except IsADirectoryError:
        shutil.rmtree(file)
    
por Jacob Vlijm 16.12.2014 / 15:25