Cria arquivos a partir de uma lista de arquivos de texto

3

Eu criei um arquivo usando:

$ ls > ls.txt

Agora eu quero ir para um diretório diferente e usar esse arquivo para criar um monte de arquivos vazios com os nomes de cada linha de ls.txt .

Qual é a maneira mais fácil de fazer isso?

    
por heyNow 16.07.2018 / 23:12

4 respostas

6

Você pode usar xargs . Depois de mudar para o novo diretório,

xargs -d '\n' touch -- < path/to/ls.txt

Observe que, se houvesse originalmente algum diretório na saída ls , eles serão criados como arquivos simples no novo local.

    
por 16.07.2018 / 23:28
2

Deixe-me incentivá-lo a dar um passo atrás.

Parece que seu problema real é: "Eu tenho alguns arquivos em meu diretório atual e quero criar arquivos vazios com os mesmos nomes em um diretório diferente".

Você supôs que uma maneira razoável de fazer isso seria começar salvando os resultados de ls em um arquivo. Uma suposição razoável, mas certamente não é a única maneira de fazer isso!

Como sobre o seguinte?

for filename in *; do
    touch -- "/path/to/somewhere/else/${filename}"
done

onde /path/to/somewhere/else/ é o diretório no qual você deseja criar os arquivos.

Esta abordagem é simples e fácil de ler. Além disso, é completamente robusto para espaços em branco, novas linhas e caracteres especiais nos nomes de arquivos. Não quebra se o seu perfil aliasse ls para algo como ls --color .

Uma desvantagem é que, se você tiver muitos arquivos, isso pode estar fazendo muito trabalho extra. Mas não se preocupe com isso até que se torne um problema. *

Outra desvantagem é que, se não houver arquivos em seu diretório atual, isso criará um arquivo chamado literalmente * . Você pode evitar isso escrevendo shopt -s nullglob antes do loop.

Observe que (assim como acontece com outras soluções) se você tiver um diretório d em seu diretório atual, um novo arquivo vazio d será criado no destino. Se você quiser evitar isso, você pode escrever:

for filename in *; do
    if [ -f "${filename}" ]; then
        touch -- "/path/to/somewhere/else/${filename}"
    fi
done

para processar apenas arquivos normais.

* Se houver um problema: printf '%code%\n' * | (cd /path/to/somewhere/else; xargs -0 touch --) funcionará bem.

    
por 17.07.2018 / 08:59
0

sed "s/\(.*\)/touch ''/" < ls.txt | sh

isso transforma o arquivo em um script de shell que cria os arquivos com touch e grava esse script em uma sessão do shell. Execute este comando na pasta onde você deseja os arquivos. Substitua ls.txt pelo seu nome completo, se estiver em uma pasta diferente.

    
por 17.07.2018 / 05:57
0
OFS=$IFS; 
IFS=$'\n';
cd to_new_location;
for file in 'cat /path/to/ls.txt'; do
   touch $file;
done;
IFS=$OFS;
    
por 16.07.2018 / 23:24