mover arquivo por lista em arquivo (com espaço em branco à esquerda)


11

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 /tmp/list.txtpara/app/dest

Portanto, deve ser algo como isto:

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

Respostas:


21

Você está apenas perdendo a -topção para mv(assumindo o GNU mv):

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

ou mais curto (inspirado na resposta de X Tian):

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

os espaços iniciais (e possíveis à direita) são removidos. Os espaços nos nomes dos arquivos levarão a problemas.

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

sed 's/^ *//' < /tmp/list.txt | xargs -d '\n' mv -t /app/dest/

Obrigado pela resposta. com isso eu posso fazer uma lista de muitos arquivos com [!] em seu nome e ir para outra pasta, com o seguinte: ls | grep -e ". [!]]" | tee 001.txt; sed 's / ^ * //' <001.txt | xargs -d '\ n' mv -t / destinypath /
inukaze

6

Supondo que os nomes dos arquivos sejam relativamente sãos (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 

Oi Terdon, como mover pastas para um novo diretório com base na correspondência no arquivo csv? Você poderia me ajudar com isso [ unix.stackexchange.com/questions/433068/… Obrigado !!
user3351523

@ user3351523 sua pergunta foi encerrada. Pedir ajuda a pessoas aleatórias não vai mudar isso. Em vez disso, edite a pergunta e explique como as soluções na duplicata não o ajudaram. Se algo "não funcionou", explique como falhou. As soluções devem funcionar para você, então você precisa explicar o que acontece quando as experimenta.
terdon

Eu fiz isso. você pode dar uma olhada.
user3351523

@ user3351523 você não explicou por que as soluções do dupe falham para você. E você não explicou como as respostas que obtiveram falham. Você pode apenas precisar usar, cp -Hrmas não sei se o OSX cpsuporta isso.
terdon

3
for i in $(cat /tmp/list.txt); do mv "$i" /app/dest/; done

1

Xargs puros lendo diretamente do arquivo

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

editar 1 - após o comentário de @Anthon abaixo,

xargs -I{} < flist  mv -v {} /app/dst

1
-ié profanado, e ele, ou seu substituto -I implica -l/ --max-lines=1. E isso faz mvcom que seja executado para cada arquivo separadamente.
Anthon

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.