O bash não lê o conteúdo do arquivo, a menos que você o diga.
for file in $(cat ~/Desktop/files.txt); do mv "$file" ~/newfolder; done
Eu tenho uma lista de arquivos, com seus caminhos completos, um por linha em um arquivo "files.txt"
Eu estava tentando mover todos esses arquivos do local original para um novo diretório.
Eu gravei no diretório onde eles moram agora e publiquei
for file in ~/Desktop/files.txt do mv $file ~/newfolder
mas nada acontece. Tenho certeza de que estou sentindo falta de algo óbvio
Você precisa dizer ao seu loop para ler o arquivo, caso contrário, ele está apenas executando:
mv ~/Desktop/files.txt ~/newfolder
Além disso, como nerdwaller disse, você precisa de separadores. Tente isto:
while read file; do mv "$file" ~/newfolder; done < ~/Desktop/files.txt
Se os seus caminhos ou nomes de arquivo contiverem espaços ou outros caracteres estranhos, talvez seja necessário fazer isso:
while IFS= read -r file; do mv "$file" ~/newfolder; done < ~/Desktop/files.txt
Observe as cotas "
em torno da variável $file
.
Se os nomes dos arquivos não contiverem espaço em branco:
mv -t dest_dir $(< text.file)
é provavelmente a maneira mais concisa.
Se houver espaço em branco nos nomes de arquivos
while IFS= read -r filename; do mv "$filename" dest_dir; done < test.file
é seguro.
Possivelmente
mv -t dest_dir $(sed 's|^|"|;s|$|"|' text.file)
também lida com nomes de arquivos com espaços enquanto ainda está usando um único comando mv e nenhum loop. Não testado.