Datei nach Liste in Datei verschieben (mit führendem Leerzeichen)

11

Ich habe eine Datei, die Dateinamen enthält. Beispielsweise:

/tmp/list.txt (Es steht mit den Leerzeichen am Anfang jeder Zeile):

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

Ich möchte, eine Zeile verwenden, um alle die Dateien zu verschieben aufgeführt in /tmp/list.txtzu/app/dest

Also sollte es ungefähr so ​​sein:

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

Antworten:

20

Sie vermissen nur die -tOption für mv(unter der Annahme von GNU mv):

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

oder kürzer (inspiriert von X Tians Antwort):

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

Die führenden (und möglichen nachfolgenden) Leerzeichen werden entfernt. Leerzeichen innerhalb der Dateinamen führen zu Problemen.

Wenn die Dateinamen Leerzeichen oder Tabulatoren oder Anführungszeichen oder Backslashes enthalten, können Sie unter der Annahme von GNU xargsFolgendes verwenden:

sed 's/^ *//' < /tmp/list.txt | xargs -d '\n' mv -t /app/dest/
Anthon
quelle
Danke für die Antwort . Damit kann ich eine Liste vieler Dateien mit [!] im Namen erstellen und in einen anderen Ordner verschieben, mit folgendem: ls | grep -e ". [!]]" | Tee 001.txt; sed 's / ^ * //' <001.txt | xargs -d '\ n' mv -t / destinypath /
inukaze
6

Angenommen, Ihre Dateinamen sind relativ vernünftig (keine Zeilenumbrüche oder seltsamen Zeichen):

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

Umgang mit seltsamen Dateinamen (Unterbrechungen, wenn ein Dateiname eine neue Zeile enthält):

while IFS= read -r file; do mv "$file" /app/dest/; done < list.txt 
terdon
quelle
Hallo Terdon, wie verschiebe ich Ordner in ein neues Verzeichnis, basierend auf ihrer Übereinstimmung in der CSV-Datei? Könnten Sie mir bitte dabei helfen ? [ Unix.stackexchange.com/questions/433068/… Danke !!
user3351523
@ user3351523 Ihre Frage wurde geschlossen. Das Bitten zufälliger Leute um Hilfe wird das nicht ändern. Bearbeiten Sie stattdessen die Frage und erklären Sie, wie Ihnen die Lösungen im Duplikat nicht geholfen haben. Wenn etwas "nicht funktioniert hat", erklären Sie, wie es fehlgeschlagen ist. Die Lösungen sollten für Sie funktionieren, daher müssen Sie erklären, was passiert, wenn Sie sie ausprobieren.
Terdon
Ich habe das gemacht. Sie können einen Blick darauf werfen.
user3351523
@ user3351523 Sie haben nicht erklärt, warum die Lösungen des Betrügers für Sie fehlschlagen. Und Sie haben nicht erklärt, wie die Antworten, die Sie erhalten haben, fehlschlagen. Möglicherweise müssen Sie nur verwenden, cp -Hraber ich weiß nicht, ob OSX dies cpunterstützt.
Terdon
3
for i in $(cat /tmp/list.txt); do mv "$i" /app/dest/; done
Mavillan
quelle
1

Reine Xargs, die direkt aus der Datei lesen

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

edit 1 - nach @Anthons Kommentar unten,

xargs -I{} < flist  mv -v {} /app/dst
X Tian
quelle
1
-iist abgeschrieben, und es, oder es Ersatz -Ich impliziere -l/ --max-lines=1. Und es wird mvfür jede Datei separat ausgeführt.
Anthon
0
mv `cat /tmp/list.txt` /app/dest/

(Leerzeichen am Start werden ignoriert)

Espen Mikal Robertsen
quelle