Respostas:
Use xargs
:
xargs rm < file # or
xargs -a file rm
Mas isso não funcionará se os nomes / caminhos de arquivos contiverem caracteres que devem ser escapados.
Se seus nomes de arquivos não tiverem novas linhas, você poderá:
tr '\n' '\0' < file | xargs -0 rm # or
xargs -a file -I{} rm {}
Como alternativa, você pode criar o seguinte script:
#!/bin/bash
if [ -z "$1" ]; then
echo -e "Usage: $(basename $0) FILE\n"
exit 1
fi
if [ ! -e "$1" ]; then
echo -e "$1: File doesn't exist.\n"
exit 1
fi
while read -r line; do
[ -n "$line" ] && rm -- "$line"
done < "$1"
Salve como /usr/local/bin/delete-from
, conceda permissão de execução:
sudo chmod +x /usr/local/bin/delete-from
Em seguida, execute-o com:
delete-from /path/to/file/with/list/of/files
cat file
" no (ba) sh ou csh.
cat
é inútil , como acabamos de dizer, aproveite stdin
! Veja sua resposta atualizada
Aqui está uma maneira de lidar com nomes de arquivos com espaço em branco, barras invertidas e outros caracteres estranhos:
while read -r file; do rm -- "$file"; done < list.txt
Isso lerá cada linha de list.txt
, salvará como $file
e executará rm
nela. Os -r
garante que as barras invertidas são lidos literalmente (de modo que \t
corresponde a um \
e um t
e não um TAB). Os --
garante que ele também lida com nomes de arquivos começando com -
.
Você também pode fazer isso no Perl:
perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt
Este irá ler cada nome de arquivo no %k
hash e depois usá-lo unlink
para excluir cada um deles.
Através de python.
import sys
import os
fil = sys.argv[1]
with open(fil) as f:
for line in f:
os.remove(line.rstrip('\n'))
Salve o script acima em um arquivo chamado like script.py
e execute o script disparando o comando abaixo no terminal.
python3 script.py file
file
é um arquivo de entrada em que o caminho dos arquivos que você realmente deseja remover são armazenados.
Outra maneira de fazer isso:
Você pode 'preparar' o arquivo transformando-o em um shell script:
$ sed -E "s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
Se seus nomes de arquivos tiverem uma única citação ( '
), você poderá usar esta versão ligeiramente expandida para escapar deles primeiro:
$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
rm 'a file with "quotes"'
rm 'a file with '\''quotes'\'''
E você pode executar isso canalizando-o para sh
:
$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file | sh
Pelo que entendi, você tem um arquivo de texto com os arquivos com os caminhos completos. Existem duas possibilidades:
Sua lista tem os nomes de arquivos separados por novas linhas, ou seja, cada linha tem o caminho completo para um arquivo. neste caso: aqui está uma saída simples:
for i in $(cat listOfFiles.txt); do
rm -f $i
done
Se sua lista tiver uma ou mais linhas de nomes de arquivos separadas por espaços ou tabulações, aqui está o detalhamento:
sed -i 's/\s\+/\n/g' listOfFiles.txt
isso converterá todos os espaços em branco em novas linhas
for i in $(cat listOfFiles.txt); do
rm -f $i
done
Sim, existem várias maneiras de fazer isso, mas essa é uma abordagem muito simples.
cat
não é necessária, você pode usar ostdin
redirecionamento:< file xargs rm