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/

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/

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 

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


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

1
-ijest przestarzałe i zastępuje-sugeruje -l/ --max-lines=1. I powoduje, mvże jest wykonywany dla każdego pliku osobno.
— Anthon

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.