Programować kolejkowanie plików do kopiowania / przenoszenia / usuwania w systemie Linux?


10

Szukałem w sieci odpowiedzi Linuksa na coś takiego jak Teracopy (Windows) ... ale nie znalazłem nic odpowiedniego.

Najbliższe rzeczy, które dostałem to:

Czy ktoś może mi polecić proste narzędzie do kopiowania plików, które może umieszczać w kolejce pliki do kopiowania / przenoszenia / usuwania? Najlepiej, jeśli mogę przeciągać i upuszczać z Nautilusa.

Jeśli coś takiego nie istnieje, czy ktoś może mi powiedzieć, dlaczego? ... czy jestem jedyną osobą, która potrzebuje czegoś takiego?


2
Przydałoby się dokładnie wyjaśnić, czego chcesz. Myślę, że większość użytkowników Linuksa nie będzie zaznajomiona z „Teracopy”.
Peltier

1
Czy to dlatego, że duże kopie i usuwanie wymagają czasu, a interfejs GUI jest niedostępny / mniej przydatny podczas działania?
dmckee --- były moderator kociąt

Częściowe wyjaśnienie tej prośby można znaleźć tutaj: superuser.com/questions/9284/…
dmckee --- były moderator kociąt

Chwileczkę, czy MiniCopier nie jest dostępny dla Linuksa? To aplikacja Java.
Ryan C. Thompson,

1
@Tobu Terracopy może ustawiać w kolejce i wstrzymywać wiele zadań kopiowania
Kokizzu

Odpowiedzi:


3

Właśnie napisałem ten prosty skrypt, który nazwałem „cpw”, aby rozwiązać ten problem.

Używasz go tak, jakbyś używał cp ... jedyną różnicą jest to, że buduje tablicę dowolnych procesów cpw, które są już uruchomione podczas uruchamiania i czeka na ich zakończenie przed przekazaniem poleceń cp. W ten sposób zachowuje się jak kolejka samoorganizująca się.

Możesz dodawać zadania cpw w tle, ale nie będą się one wzajemnie na siebie naciskać. Będą wykonywane pojedynczo.

Jestem pewien, że inni mogą zaproponować ulepszenia.

#!/bin/bash

cpwpids=(`ps -ef | grep $USER | grep 'cpw' | grep -v grep | grep -v $$ | awk '{ print $2 }'`) #build an array of all cpw procs for this user that aren't this one.

cpwcnt=${#cpwpids[@]} # number of elemenets in the above array
cnt=$cpwcnt # counter to be decremented each pass
while [ $cnt -gt 0 ]
do
    cnt=$cpwcnt
    for i in "${cpwpids[@]}" # check if each pid has died yet
    do
        ps --pid $i >/dev/null
        if [ $? -gt 0 ]
        then
            let "cnt -= 1"
        fi
    done
    sleep 2
done
cp -v "$@" >> /tmp/cpw.log #log

Przykład użycia:

$ cpw -R /src/tree /dest/tree &

Tylko ostrzeżenie, próbowałem tego skryptu iz powodu, dla którego nie zbadałem dalej, może zawiesić się w nieskończoność, czekając na zakończenie innych skryptów. Bardziej niezawodnym sposobem na uzyskanie wyłączności w bash jest użycie flock -e. Zobacz na przykład tutaj: stackoverflow.com/questions/17996577/…
px1mp

1

Z mojego doświadczenia, wykonywanie kilku kopii jednocześnie w Linuksie tak naprawdę nie zmniejsza ogólnej przepustowości. Mój pomiar przepustowości oparty jest na argumencie -P rsync. Moim szczególnym przypadkiem jest oddzielne kopiowanie jednocześnie wielu folderów pełnych dużych plików z dysku twardego USB.

Więc jeśli nie kopiujesz wielu rzeczy naraz, wszystko powinno być w porządku.


Przykro mi to mówić, ale to bardziej jak komentarz. Dużo opinii, nie do końca odpowiedź.
Mrchief

1

Ponieważ skrypt podany przez Josha Arenberga może mieć pewne problemy z impasem (których do tej pory nie doświadczyłem, ale też nie zbadałem), coś napisałem sam. Nie powinno mieć problemów z zakleszczeniem. Działa również dla każdego polecenia powłoki, nie tylko cp.

Contents of ~/bin/q

#!/bin/bash

#this waits for any PIDs to finish
anywait(){

    for pid in "$@"; do
        while kill -0 "$pid" 2&>1 >/dev/null; do
            sleep 0.5
        done
    done
}


PIDFILE=~/.q.pid

#open PIDFILE and aquire lock
exec 9>>$PIDFILE
flock -w2 9 || { echo "ERROR: flock() failed." >&2; exit 1; }

#read previous instances PID from PIDFILE and write own PID to PIDFILE
OLDPID=$(<$PIDFILE)
echo $$>$PIDFILE

#release lock
flock -u 9

#wait for OLDPID
anywait $OLDPID

#do stuff
"$@"


#afterwards: cleanup (if pidfile still contains own PID, truncate it)
flock -w2 9 || { echo "ERROR: flock() failed." >&2; exit 1; }
if [ $(<$PIDFILE) == $$ ]; then
truncate -s0 $PIDFILE
fi
flock -u 9

Tworzy łańcuch procesów, z których każdy czeka na poprzedni. Jeśli proces w środku łańcucha zawiedzie podczas oczekiwania (mało prawdopodobne, ale niemożliwe), łańcuch jest zrywany i obie części biegną równolegle. To samo dzieje się, jeśli jeden z procesów zostanie zabity.

Użycie takie jak to:

q $COMMAND $ARGS

lub nawet

q $COMMAND $ARGS; $ANOTHER_COMMAND $MORE_ARGS

Przetestuj np. Pisząc

q sleep 10 &
q echo blubb &

i stwierdzenie, że po 10 sekundach drukowany jest blubb.


Czasami pojawia się błąd odmowy uprawnień dla while kill -0 "$pid" 2&>1 >/dev/null; dolinii. Jakieś pomysły?
Mrchief

Ok, więc po długim używaniu mogę powiedzieć, że to nie działa. Być może przyczyną jest błąd dostępu, ale widzę, jak wiele cpsię na mnie kroczy.
Mrchief


0

Nie znam czegoś takiego dla Linuksa (choć nie oznacza to, że gdzieś takiego nie ma). Oprogramowanie dla systemu Linux jest zwykle pisane przez użytkowników systemu Linux. Doświadczeni użytkownicy Linuksa mogą nie myśleć o stworzeniu takiego narzędzia, ponieważ jeśli zauważą spowolnienie kopiowania podczas sesji GUI, prawdopodobnie przełączą się na terminal i skopiują za pomocą wiersza poleceń.

Oto kilka podstawowych narzędzi do kopiowania z linii poleceń, które są bardzo szybkie i nie powinny wpływać na środowisko pulpitu:

  • cp („cp foo / path / to / bar” skopiuje foo do paska)
  • mv („mv foo / path / to / bar” przenosi (zmienia nazwę) foo na pasek)
  • tar ("tar cf - foo | (cd / path / to / archive /; tar xf -)" rekurencyjnie skopiuje katalog)
  • rsync („rsync -r foo / path / to / archive /” rekurencyjnie skopiuje katalog)

0

Utwórz listę plików i użyj SCP, aby wykonać kopię. Zaletą Linuksa jest to, że możesz dodać do pliku tekstowego za pomocą echa.


0

Znalazłem ten projekt Unix Batch System o nazwie Bufor zadań, który pozwala ci ustawiać w kolejce zadania.

Lub możesz to zrobić sudo apt-get install task-spooler

Po zainstalowaniu możesz po prostu umieścić ts(lub tspw systemach Ubuntu / Debian) przed dowolnym zwykłym poleceniem powłoki, aby ustawić je w kolejce.

Ta strona zawiera wiele przykładów na temat jej zastosowań: https://www.ostechnix.com/add-linux-commands-queue-execute-one-one/ lub oglądasz film tutaj: https://www.youtube.com / watch? v = wv8D8wT20ZY

Sprawdziłem to i wydaje się, że działa zgodnie z oczekiwaniami dla wszystkich moich cppoleceń.

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.