przenieś plik według listy w pliku (z wiodącymi białymi znakami)

12

Mam plik zawierający nazwy plików. Na przykład:

/tmp/list.txt (ze spacjami na początku każdej linii):

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

Chcę, używając jednego wiersza, aby przenieść wszystkie pliki wymienione w /tmp/list.txtcelu/app/dest

Powinno to być coś takiego:

cat /tmp/list.txt | xargs mv /app/dest/
Nir
źródło

Odpowiedzi:

21

Brakuje tylko -topcji mv(zakładając GNU mv):

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

lub krótszy (inspirowany odpowiedzią X Tiana):

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

wiodące (i możliwe końcowe) spacje są usuwane. Odstępy w nazwach plików mogą powodować problemy.

Jeśli w nazwach plików masz spacje, tabulatory, cudzysłowy lub ukośniki odwrotne, zakładając, że GNU xargsmożesz użyć:

sed 's/^ *//' < /tmp/list.txt | xargs -d '\n' mv -t /app/dest/
Anthon
źródło
Dziękuję za Twoją odpowiedź . dzięki temu mogę utworzyć listę wielu plików z [!] w ich nazwie i przejść do innego folderu, wykonując następujące czynności: ls | grep -e ". [!]]" | tee 001.txt; sed 's / ^ * //' <001.txt | xargs -d '\ n' mv -t / destinypath /
inukaze
6

Zakładając, że twoje nazwy plików są względnie rozsądne (bez nowych znaków lub dziwnych znaków):

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

Aby poradzić sobie z dziwnymi nazwami plików (psuje się, jeśli nazwa pliku ma nowy wiersz):

while IFS= read -r file; do mv "$file" /app/dest/; done < list.txt 
terdon
źródło
Cześć Terdon, jak przenieść foldery do nowego katalogu na podstawie ich dopasowania w pliku csv? Czy możesz mi pomóc z tym [ unix.stackexchange.com/questions/433068/… Dziękuję !!
user3351523
@ user3351523 twoje pytanie zostało zamknięte. Proszenie losowych osób o pomoc tego nie zmieni. Zamiast tego edytuj pytanie i wyjaśnij, w jaki sposób rozwiązania w duplikacie nie pomogły. Jeśli coś „nie działało”, wyjaśnij, jak to się nie udało. Rozwiązania powinny działać dla Ciebie, dlatego musisz wyjaśnić, co się stanie, gdy je wypróbujesz.
terdon
Ja to zrobiłem. możesz spojrzeć.
user3351523
@ user3351523 nie wyjaśniłeś, dlaczego rozwiązania dupe zawodzą. I nie wyjaśniłeś, w jaki sposób otrzymane odpowiedzi zawodzą. Być może będziesz musiał użyć, cp -Hrale nie wiem, czy OSX to cpobsługuje.
terdon
3
for i in $(cat /tmp/list.txt); do mv "$i" /app/dest/; done
mavillan
źródło
1

Czyste xargs czytające bezpośrednio z pliku

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

edycja 1 - po komentarzu @Anthon poniżej,

xargs -I{} < flist  mv -v {} /app/dst
X Tian
źródło
1
-ijest przestarzałe i zastępuje-sugeruje -l/ --max-lines=1. I powoduje, mvże jest wykonywany dla każdego pliku osobno.
Anthon
0
mv `cat /tmp/list.txt` /app/dest/

(spacje na początku są ignorowane)

Espen Mikal Robertsen
źródło