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.
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?
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.
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.
OFS=$IFS;
IFS=$'\n';
cd to_new_location;
for file in 'cat /path/to/ls.txt'; do
touch $file;
done;
IFS=$OFS;
Tags ls files input io-redirection