déplacer le fichier par liste dans le fichier (avec le premier espace)

12

J'ai un fichier qui contient des noms de fichiers. Par exemple:

/tmp/list.txt (c'est avec les espaces au début de chaque ligne):

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

Je veux, en utilisant la ligne d'un, pour déplacer tous les fichiers répertoriés dans /tmp/list.txtla/app/dest

Donc, ça devrait être quelque chose comme ça:

cat /tmp/list.txt | xargs mv /app/dest/
Nir
la source

Réponses:

21

Il vous manque juste l' -toption pour mv(en supposant GNU mv):

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

ou plus court (inspiré par la réponse de X Tian):

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

les espaces de tête (et éventuellement de fin) sont supprimés. Les espaces dans les noms de fichiers entraîneront des problèmes.

Si vous avez des espaces ou des tabulations ou des guillemets ou des barres obliques inverses dans les noms de fichiers, en supposant que GNU xargsvous pouvez utiliser:

sed 's/^ *//' < /tmp/list.txt | xargs -d '\n' mv -t /app/dest/
Anthon
la source
Merci pour la réponse . avec cela, je peux faire une liste de beaucoup de fichiers avec [!] dans leur nom, et déplacer vers un autre dossier, avec ce qui suit: ls | grep -e ". [!]]" | tee 001.txt; sed 's / ^ * //' <001.txt | xargs -d '\ n' mv -t / destinypath /
inukaze
6

En supposant que les noms de vos fichiers sont relativement sains d'esprit (pas de sauts de ligne ou de caractères étranges):

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

Pour gérer les noms de fichiers étranges (casse si un nom de fichier a une nouvelle ligne):

while IFS= read -r file; do mv "$file" /app/dest/; done < list.txt 
terdon
la source
Salut terdon, comment déplacer des dossiers dans un nouveau répertoire en fonction de leur correspondance dans le fichier csv? Pourriez-vous s'il vous plaît m'aider avec ce [ unix.stackexchange.com/questions/433068/… Merci !!
user3351523
@ user3351523 votre question a été fermée. Demander de l'aide à des personnes au hasard ne changera rien à cela. Modifiez plutôt la question et expliquez en quoi les solutions du doublon ne vous ont pas aidé. Si quelque chose «n'a pas fonctionné», expliquez comment cela a échoué. Les solutions devraient fonctionner pour vous, vous devez donc expliquer ce qui se passe lorsque vous les essayez.
terdon
Je l'ai fait. vous pouvez jeter un oeil.
user3351523
@ user3351523 vous n'avez pas expliqué pourquoi les solutions du dupe échouent pour vous. Et vous n'avez pas expliqué comment les réponses que vous avez obtenues échouent. Vous pourriez simplement avoir besoin d'utiliser, cp -Hrmais je ne sais pas si OSX cpprend en charge cela.
terdon
3
for i in $(cat /tmp/list.txt); do mv "$i" /app/dest/; done
mavillan
la source
1

Xargs purs lisant directement à partir du fichier

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

modifier 1 - après le commentaire de @Anthon ci-dessous,

xargs -I{} < flist  mv -v {} /app/dst
X Tian
la source
1
-iest obsolète, et il, ou son remplacement -J'implique -l/ --max-lines=1. Et il provoque mvà être exécuté pour chaque fichier séparément.
Anthon
0
mv `cat /tmp/list.txt` /app/dest/

(les espaces au début sont ignorés)

Espen Mikal Robertsen
la source