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.