Localizar arquivos com nome semelhante à pasta

1

Estou no OS X e tenho uma pasta que contém várias subpastas. Há duas coisas que quero fazer. A primeira é garantir que cada subpasta tenha um arquivo no formato [nome da subpasta] .grade.xml, então eu preciso pesquisar e substituir no arquivo apropriado para fazer algumas alterações.

Para a segunda parte, eu sei como usar sed em um arquivo individual para fazer o que eu preciso, mas estou tendo o problema de verificar se o arquivo está lá e, em seguida, executando o comando nele. Qualquer dica sobre como fazer isso seria apreciada.

Observação: não preciso necessariamente de uma resposta completa, especialmente porque estou tentando aprender aqui. Um ponteiro na direção certa seria bom.

(Eu percebo que pode haver maneiras melhores do que a linha de comando para conseguir isso, mas eu preciso e vou no futuro precisar fazer coisas semelhantes em outros sistemas baseados em Unix, então eu prefiro saber :)

    
por Dan G 27.12.2009 / 22:23

2 respostas

1
#!/bin/bash

# Get directory name from argument, default is . 
DIR=${1:-.}

# For each subfolder in DIR (maxdepth limits to one level in depth)
find "${DIR}" -maxdepth 1 -type d | while read dir; do
    # Check that there is a file called $dir.grade.xml in this dir
    dirname=$(basename "${dir}")
    gradefile="${dirname}"/"${dirname}".grade.xml
    if [ -e "${gradefile}" ]; then
          sed -i .bak "s/foo/bar/g" "${gradefile}"
    else
       echo "Warning: ${dir} does not contain ${gradefile}"
    fi done

Pequenos ajustes no framework do Raphink.

Pontos principais:

  • verifique diretamente a existência de arquivos com [ -e filename ] em vez de executar ls
  • coloque todas as variáveis em ${variablename} ; geralmente não é estritamente necessário, mas evita ambigüidade ( ${variablename} e ${variable}name são claramente distintos, $variablename poderia significar também)
  • passar uma extensão para sed para fazer arquivos de backup. Isso é uma boa prática (no caso de o seu erro funcionar), e, no OSX, obrigatório (a versão do raphink interpreta s/foo/bar/g como a extensão que você quer nos arquivos de backup, então tenta analisar o nome do arquivo como um comando). li>
  • Ok, eu menti, não é realmente obrigatório - você pode usar sed -i "" "s/foo/bar/g" ${gradefile} para passar uma extensão vazia, o que faria com que o sed não fizesse backup.
por 28.12.2009 / 01:47
0

OK, você precisa criar um script para isso. Eu vou pegar bash para isso.

#!/bin/bash

# Get directory name from argument, default is .
DIR=${1:-.}

# For each subfolder in DIR (maxdepth limits to one level in depth)
find $DIR -maxdepth 1 -type d | while read dir; do
    # Check that there is a file called *.xml in this dir
    if ls $dir/*.xml &>/dev/null; then
       # Loop through xml files found in $dir
       #   or do you actually need to check that there is only ONE file?
       for xmlfile in $dir/*xml; do
          # Do whatever treatment with sed you wish to do
          sed -i 's/foo/bar/g' $xmlfile
       done
    else
       echo "Warning: $dir does not have a *xml file in it"
    fi
done

Salve esse arquivo como um script .sh e execute

$ chown +x yourscript.sh
$ ./yourscript.sh /path/to/dir # Path is optional, defaults to .
    
por 27.12.2009 / 23:04