Strona podręcznika (lub internetowy podręcznik GNU ) prawie wszystko wyjaśnia.
polecenie find -exec {} \;
Dla każdego wyniku command {}
jest wykonywany. Wszystkie wystąpienia {}
są zastępowane nazwą pliku. ;
jest poprzedzony ukośnikiem, aby zapobiec jego interpretacji przez powłokę.
znajdź -exec polecenie {} +
Każdy wynik jest następnie dołączany command
i wykonywany. Biorąc pod uwagę ograniczenia długości polecenia, myślę, że to polecenie może być wykonywane więcej razy, przy wsparciu strony podręcznika:
całkowita liczba wywołań polecenia będzie znacznie mniejsza niż liczba dopasowanych plików.
Zwróć uwagę na ten cytat ze strony podręcznika:
Linia poleceń jest zbudowana w podobny sposób, w jaki xargs buduje swoje linie poleceń
Dlatego żadne znaki nie są dozwolone między {}
i +
z wyjątkiem białych znaków. +
powoduje, że find wykryje, że argumenty powinny być dołączone do polecenia tak samo, jak xargs
.
Rozwiązanie
Na szczęście implementacja GNU mv
akceptuje katalog docelowy jako argument, z jednym -t
lub dłuższym parametrem --target
. Jego użycie będzie:
mv -t target file1 file2 ...
Twoje find
polecenie staje się:
find . -type f -iname '*.cpp' -exec mv -t ./test/ {} \+
Ze strony podręcznika:
-exec polecenie;
Wykonaj polecenie; prawda, jeśli zwracany jest status 0. Wszystkie następujące argumenty do znalezienia są traktowane jako argumenty polecenia, aż do argumentu składającego się z `; ' napotkano. Ciąg `{} 'jest zastępowany przez aktualnie przetwarzaną nazwę pliku wszędzie tam, gdzie występuje w argumentach polecenia, a nie tylko w argumentach, w których występuje samodzielnie, jak w niektórych wersjach find. Obie te konstrukcje mogą wymagać zmiany znaczenia (za pomocą `\ ') lub zacytowania, aby chronić je przed rozszerzaniem przez powłokę. Zobacz sekcję PRZYKŁADY, aby zobaczyć przykłady użycia opcji -exec. Określone polecenie jest uruchamiane raz dla każdego dopasowanego pliku. Polecenie jest wykonywane w katalogu startowym. Istnieją nieuniknione problemy związane z bezpieczeństwem związane z użyciem akcji -exec; powinieneś zamiast tego użyć opcji -execdir.
-exec polecenie {} +
Ten wariant akcji -exec uruchamia określone polecenie na wybranych plikach, ale wiersz poleceń jest tworzony przez dołączanie na końcu każdej wybranej nazwy pliku; całkowita liczba wywołań polecenia będzie znacznie mniejsza niż liczba dopasowanych plików. Linia poleceń jest zbudowana w podobny sposób, w jaki xargs buduje swoje linie poleceń. W poleceniu dozwolone jest tylko jedno wystąpienie `{} '. Polecenie jest wykonywane w katalogu startowym.