Skopiuj listę plików z zachowaniem struktury katalogów, bez skryptów

2

Czy istnieje sposób na skopiowanie listy plików, które współużytkują wspólny katalog podstawowy, zachowując ich względną strukturę katalogów? Pliki ze ścieżkami względnymi są wymienione w pliku tekstowym. edycja Mam nazwy plików wymienione w zwykłym pliku tekstowym.

Chciałbym to zrobić bez użycia skryptu (bez bash / batch / python / ruby ​​/ lua / itp.), Podobnie jak w wget -iprzypadku adresów URL. (Moim powodem jest to, że dałoby to ogólne / niestandardowe rozwiązanie dla dość powszechnego zadania).

Próbowałem cat list.txt | xargs -I % cp % new_folderz Kopiuj listę plików, ale nie zachowała względnej ścieżki do katalogu.

Zrobiłbym to, aby wyeksportować mój wybór plików (które już mam w pliku tekstowym) ze struktury katalogów, która ma dużą liczbę plików (zdarza się to od czasu do czasu).

n611x007
źródło
Innym powodem korzystania z samodzielnego polecenia zamiast niestandardowych skryptów jest to, że programy są zwykle instalowane lub mają pakiety / instalatory, które można znaleźć w sieci, pamiętając samą nazwę programu , podczas gdy trzeba go pisać ponownie za każdym razem lub brać twoje własne skrypty wszędzie odczuwają mniejszą korzyść (nawet jeśli nie masz problemów ze swoimi umiejętnościami).
n611x007,

Odpowiedzi:

4

tar cvf - ./filesAndDirecotries | (cd targetDirectory; tar xvf - )

TAR (Tape Archive to stara komenda do utworzenia pliku archiwum) może zapisywać do stdin (parametr „-” dla pliku) i potokować i czytać ze stdin w drugim katalogu.

Powyższe polecenie najpierw tworzy plik tar i zapisuje do stdin i przesyła potokiem do powłoki oraz zmienia katalog i rozpakowuje plik, czytając go ze stdin.

unixUser
źródło
W moim pytaniu nie byłem wystarczająco jasny, że próbowałem użyć pliku tekstowego z listą nazw plików i szukałem opcji użycia tego pliku tekstowego z programu, który można skopiować. To rozwiązanie jest jednak bardzo miłe i poprowadziło mnie we właściwym kierunku, ponieważ myślę, że można to zrobić za pomocą -Tprzełącznika:-T, --files-from F: get names to extract or create from file F
n611x007
Zaakceptuję to, ponieważ było to najbliższe temu, co miałem na myśli, i postawiłem mnie na właściwej drodze. Zredagowałem pytanie, aby wskazać istnienie pliku tekstowego. Możesz zaktualizować swoją odpowiedź, jeśli chcesz. Wreszcie użyłemtar cvf - -T filelist.txt | tar xvf - -C newdir
n611x007
4

Odpowiedź od unixUser postawił mnie na właściwe tory. Okazuje się, że tarpotrafi zarówno odczytywać nazwy plików, jak i katalogów z pliku tekstowego -T, a nawet zmieniać katalog za pomocą -C:

tar cvf - -T filelist.txt | tar xvf - -C newdir

To odpowiada na pytanie, które miałem.


źródła

Aby uzyskać te informacje od pomysłu unixUser dał mi , ja zanurkował do plików tar z pliku tekstowego , co prowadzi do trpn „s (P) i Tinkster ” (A) s konwersję LinuxQuestions.org . Jednocześnie sprawdzając stronę podręcznika tar pod kątem dowolnej opcji związanej z plikiem , oba wyszukiwania doprowadziły do -Tprzełącznika! Aby uniknąć polegania na powłoce do zmiany katalogu, przeszukałem ją również w poszukiwaniu opcji związanych z katalogiem i znalazłem -Cprzełącznik. - Widzę, że tarjest prawdopodobnie polecenie przeznaczone do grupowania (kopii) plików na wiele sposobów.

Dzięki temu można użyć pliku binarnego tar bez * polegania na skryptach. Po prostu niesamowite, jak przydatna jest smoła.


(*: Z preferencjami : Uważam bash / perl / python / cokolwiek zbyt ogólne narzędzie do tego dość dokładnie . Zadania Jednakże, jak wskazał przez grawity , rury są wygodne - bez nich powinniśmy być zmuszeni do utworzenia pliku pośredniego, np. tar cvf intermediate.tar -T filelist.txti tar xvf intermediate.tar -C newdir.)

n611x007
źródło
1

Technicznie rzecz biorąc, podany przykład używa już bash. I właśnie dlatego powłoka jest przede wszystkim skryptowalna - jest to tak proste zadanie, że nie potrzeba do tego dedykowanego narzędzia / programu .

cat list.txt | xargs -n1 nazwa_katalogu | sortuj | uniq | xargs -I% mkdir -p nowy_folder /%
cat list.txt | xargs -I% cp% nowy_folder /%

Lub:

cat list.txt | podczas czytania ścieżki; zrobić
    mkdir -p "nowy_folder / $ {ścieżka% / *}" && cp "$ ścieżka" "nowy_folder / $ ścieżka"
gotowy

Lub:

cat list.txt | xargs -I% install -Dm0644% nowy_folder /%

Lub:

cat list.txt | podczas czytania ścieżki; zrobić
    install -Dm0644 „$ ścieżka” „nowy_folder / $ ścieżka”
gotowy

( installjest krótszy, ale nie zachowuje trybów, niestety).

grawitacja
źródło
masz rację co do bash, ale wprowadziłem rozróżnienie na podstawie tego, że wprowadzenie przepływu sterowania i zmiennych jest naprawdę przesadą w tym, a im więcej zależności wprowadzisz, tym bardziej zależne jest rozwiązanie na platformie. Nie jestem też zadowolony z zamiany ciągów, ale to był najbliższy przykład, jaki dostałem. Z drugiej strony większość platform rozumie potok, więc jest to mniejsza zależność. Twoje pierwsze rozwiązanie, które naprawia przykład, jest najbliższe, dzięki!
n611x007,
Są platformy, które z łatwością uruchamiają Perla, ale nie mają bash ani xargs (Windows) ani nawet łatwych w użyciu potoków (VMS).
grawity
Znowu dobrze. Podejrzewam, że próbowałem wyjaśnić moje preferencje. Z drugiej strony tarpolecenie wydaje się odpowiadać moim potrzebom; Nie wiedziałem, że ma -Tprzełącznik. Myślę, że dobrze jest mieć te opcje dostępne tak jak tutaj, a twoja odpowiedź wyjaśnia również, jak to się zwykle robi.
n611x007
Z drugiej strony powinienem się lepiej zapoznać z VMS. Nigdy go nie użyłem, ale nie pomyślałem, że brakuje rur. Zastanawiam się, czego VMS może tutaj użyć, ponieważ te też używają potoków. Czy może polegać wyłącznie na skryptach? (w Windowsie jest unxutils , gnuwin32 , cygwin , środowisko msysgit i tak dalej , aby zapewnić znajomość / funkcje)
n611x007
@naxa: Nie, VMS jest w większości martwy. Chociaż wydaje się, że jego interfejs wiersza poleceń ma obsługę potoków w późniejszych wersjach ( PIPEsłowo kluczowe), ale z całą pewnością nie został do tego zaprojektowany - w porównaniu nawet Windows CLI jest bardziej uniksowy.
grawity