move o arquivo por lista no arquivo (com espaços em branco iniciais)

8

Eu tenho um arquivo que contém nomes de arquivos. Por exemplo:

/tmp/list.txt (é com os espaços no início de cada linha):

  /tmp/file.log
  /app/nir/home.txt
  /etc/config.cust

Eu quero, usando uma linha, mover todos os arquivos listados em /tmp/list.txt para /app/dest

Portanto, deve ser algo assim:

cat /tmp/list.txt | xargs mv /app/dest/
    
por Nir 18.02.2014 / 16:38

5 respostas

17

Você está com saudades da opção -t para mv (assumindo o GNU mv ):

cat /tmp/list.txt | xargs mv -t /app/dest/

ou menor (inspirado pela resposta de X Tian):

xargs mv -t /app/dest/ < /tmp/list.txt

os espaços iniciais (e possíveis) são removidos. Espaços dentro dos nomes de arquivos levarão a problemas.

Se você tiver espaços ou tabulações ou citações ou barras invertidas nos nomes de arquivos, assumindo o GNU xargs , você pode usar:

sed 's/^ *//' < /tmp/list.txt | xargs -d '\n' mv -t /app/dest/
    
por 18.02.2014 / 16:48
6

Supondo que seus nomes de arquivos sejam relativamente saudáveis (sem novas linhas ou caracteres estranhos):

while read file; do mv "$file" /app/dest/; done < list.txt 

Para lidar com nomes de arquivos estranhos (quebras se um nome de arquivo tiver uma nova linha):

while IFS= read -r file; do mv "$file" /app/dest/; done < list.txt 
    
por 18.02.2014 / 16:50
3
for i in $(cat /tmp/list.txt); do mv "$i" /app/dest/; done
    
por 18.02.2014 / 16:46
1

Pure xargs lendo diretamente do arquivo

xargs -l -i < flist  mv -v {} /app/dst

edit 1 - depois do comentário do @Anthon abaixo,

xargs -I{} < flist  mv -v {} /app/dst
    
por 18.02.2014 / 16:54
0
mv 'cat /tmp/list.txt' /app/dest/

(espaços no início são ignorados)

    
por 19.12.2015 / 02:56