Obtém o caminho do arquivo relativamente

4

Eu tenho dois diretórios A e B. Cada um contém um zip.

Como posso escrever o caminho desses dois arquivos zip em um arquivo de texto?

Exemplo para o sistema de diretórios:

FILES/ONE/one.zip
FILES/TWO/two.zip

E eu quero executar o comando do diretório FILES

    
por Krsztr 10.01.2018 / 15:19

3 respostas

8

Você pode usar o comando find , com sua saída direcionada para um arquivo, da seguinte maneira:

/tmp/FILES$ find . -name "*.zip" -print > outfile.txt

Localize todos os arquivos terminados com zip dentro da pasta atual ( FILES ) e imprima o caminho
A saída do comando find é direcionada para um arquivo de texto:

O conteúdo do outfile.txt é:

/tmp/FILES$ cat outfile.txt 

./TWO/two.zip
./ONE/one.zip
  

Observe que, se você executar o comando find em uma pasta acima da pasta FILES , sua saída incluirá também a parte FILES da pasta.

por exemplo. quando a saída for direcionada para stdout

/tmp$ find FILES -name "*.zip" -print
FILES/TWO/two.zip
FILES/ONE/one.zip
    
por Yaron 10.01.2018 / 15:28
2

A globalização de concha simples pode conseguir isso. Por exemplo, dado

$ tree .
.
├── ONE
│   └── one.zip
└── TWO
    └── two.zip

2 directories, 2 files

então

$ printf '%s\n' */*.zip
ONE/one.zip
TWO/two.zip

Redirecione a saída para um arquivo anexando > outfile ao comando. Se você quiser preceder o ./ para tornar o caminho relativo mais explícito, altere %s para ./%s

$ printf './%s\n' */*.zip > outfile
$ cat outfile
./ONE/one.zip
./TWO/two.zip

Se você quiser fazer isso recursivamente , então bash suportará isso se você tiver ativado a opção globstar shell, por exemplo

$ cd ..
$ shopt -s globstar
$ printf '%s\n' **/*.zip
FILES/ONE/one.zip
FILES/TWO/two.zip

Se você estiver usando isso em um script, provavelmente também deve ativar a opção nullglob para manipular adequadamente o caso em que não existe nenhum arquivo correspondente.

    
por steeldriver 10.01.2018 / 16:17
0

Ou você pode fazer isso com regex

find /tmp/FILES -regextype posix-egrep -regex ".*/*/*.zip" > outfile.txt

A saída é a mesma:

./TWO/two.zip
./ONE/one.zip

O problema é que ele corresponderá a todos os arquivos zip de qualquer subpasta. Se você pode definir subpastas contendo arquivos, você pode fazer:

find /tmp/FILES -regextype posix-egrep -regex ".*/(ONE|TWO)/*.zip" > outfile.txt
    
por Petr 10.01.2018 / 15:47