Script para colocar nomes de arquivos do diretório de trabalho em um arquivo de texto para que os comandos possam ser executados neles

2

Eu quero criar um script que coloque nomes de arquivos do diretório de trabalho (com uma extensão específica) no arquivo de texto com algumas sequências adicionais:

Por exemplo, se eu estiver interessado em arquivos com extensão i e arquivos em meu diretório:

1.b  1.i  2.i  2.z 3.i

Eu quero criar um arquivo de texto como:

command_1
command_2 1.i 1.o && command_2 2.i 2.o && command_2 3.i 3.o &
    
por Gena Kozyukin 21.04.2015 / 20:56

3 respostas

1

Encontrei uma solução melhor.

Ignorar a criação de um arquivo de texto e criar um script para executar vários arquivos em uma pasta

#!/bin/bash

for file in *.i*
do
  [[ "${file##*.}" =~ fchk ]] && continue
  qchem "$file" "${file%.*}".out 
done

clear
echo "DONE!"
    
por Gena Kozyukin 23.04.2015 / 11:32
1

Considerando sua resposta, você não quer realmente criar um arquivo de texto, mas apenas procurar por arquivos e processá-los. Você pode usar o comando find para isso, por exemplo, para renomear todos os arquivos terminados em .i substituindo i por o do:

find -maxdepth 1 -type f -name "*.i" -exec bash -c 'mv "$0" "${0/i/o}"' "{}" \;

Explicações

  • -maxdepth 1 fica no diretório atual
  • -type f somente arquivos de pesquisa
  • -name "*.i" arquivos de pesquisa que terminam em .i
  • -exec executa o seguinte comando no arquivo, {} é substituído pelo nome do arquivo, precisa ser finalizado com \;
  • bash -c inicia um subshell executando os seguintes comandos, adicionando "{}" , damos a ele o nome do arquivo como argumento 0
  • mv "$0" "${0/i/o}" renomeia o arquivo substituindo i por o - apenas um exemplo, é claro, pode ser substituído por qualquer comando (cadeia de) que você goste
  • \; termina a opção -exec

Para comandos que podem levar mais de um arquivo de cada vez, você pode substituir \; by + para encadear os argumentos, veja Qual é a diferença entre usar '+' (mais) e ';' (ponto-e-vírgula) no comando -exec? .

    
por dessert 04.09.2017 / 10:02
0

Uma alternativa se, por algum motivo, você quiser usar um arquivo para armazenar a lista de arquivos:

ls *.i  > input.txt
for F in $(cat /path/to/input.txt) ; do
...
done;

ou, se você tiver espaços em seus nomes de arquivos

while read F  ; do
...
done </path/to/input.txt
    
por Bruni 04.09.2017 / 09:44