Removendo um diretório com o nome de um arquivo

2

Estou procurando um snippet de código para colocar em um .sh que remova um diretório com o nome de um arquivo.

O que quero dizer com isso é que eu gostaria de mover para especificar um diretório e, em seguida, procurá-lo por uma lista de arquivos do tipo ".XXX" e, em seguida, remover todos os subdiretórios (com conteúdo) com o mesmo nome.

Pseudo código do que eu quero fazer:

find names all files of type .XXX within a directory
find and remove all subdirectories with names that equal the file names found

Como alguém poderia fazer isso? Eu estive olhando para a função find, que eu usarei antes desta função para unrar archives:

'find . -name "*.rar" -exec unrar x '{}' \;'
    
por sehesod 15.07.2012 / 21:53

3 respostas

0

O que não está muito claro aqui é que você não pode ter um arquivo e um diretório com o mesmo nome. Além disso, desde que você mencionou descompactar arquivos rar, pode-se pensar que você deseja remover o diretório nomeado após o arquivo rar. Isso é estranho porque, por que você quer deletá-lo depois de descompactar?

Com base na minha fraca compreensão do problema (que pode melhorar se você esclarecer ou, melhor ainda, fornecer um exemplo), isso pode funcionar:

for i in *rar; do
    (cd uncompressed && rm -rf $i)
done

então se você tiver algo como

./file1.rar
./file2.rar
./file3.rar
./uncompressed/file1.rar/...
./uncompressed/file2.rar/...
./uncompressed/file3.rar/...

o mini-script que eu postei deve deletar todos os subdiretórios * .rar / do arquivo em descomprimido.

    
por roadmr 15.07.2012 / 22:53
0

Se você deseja encontrar todos os diretórios, d contém um arquivo d.xyz. Então isso vai encontrar os diretórios para você.

find . -type d -print0 |
xargs -0 --replace={} --max-args=1 bash -c 'find {} -maxdepth 1 -name $(basename {}).xyz -print0' |
xargs -0 --replace={}  bash -c 'echo $(dirname {})'

explicação:

  1. encontre todos os arquivos do diretório type que são descendentes do diretório de trabalho atual
  2. então para cada diretório d (e estritamente um de cada vez), que tem filhos diretos cujo nome é d.xyz
  3. imprima o nome do diretório
por ctrl-alt-delor 15.07.2012 / 22:59
0

Crie um script de shell como este:

#!/bin/bash
rm -rf $(dirname )/$(basename  .)

Use o seguinte para encontrar arquivos e remover os diretórios:

find . -name "*.XXX" -exec /path/to/script {} XXX \;

Substitua XXX pela extensão que você deseja pesquisar.

O que o script faz:

  • O primeiro parâmetro é o caminho de um arquivo.
  • Segundo parâmetro é a extensão que você está pesquisando.
  • dirname recebe um caminho e retorna o diretório onde o arquivo está localizado.
  • basename recebe um caminho e retorna o nome do arquivo e, opcionalmente, remove um sufixo, neste caso, a extensão.

find passa para o script o caminho para o arquivo compactado pesquisado e a extensão pesquisada, por exemplo /path/to/script /home/user/test/file1.rar rar .

dirname expande para dirname /home/user/test/file1.rar , que retorna /home/user/test , basename expande para basename /home/user/test/file1.rar rar , que retorna file1 . Juntando tudo, o script executa rm -rf /home/user/test/file1 .

    
por Eric Carvalho 15.07.2012 / 23:00