Muszę konwertować filmy, ale nie wiem, gdzie one są, więc potrzebuję find
ich. Jak mogę podać wynik i nazwę pliku wyjściowego FFmpeg za pomocą xargs
?
Już się dowiedziałem, że mogę skonstruować dwa parametry za pomocą tego polecenia:
find . -iname "*.mov" -printf "%p %f\n"
Nie mogę znaleźć niczego związanego w xargs
instrukcji. Chcę coś takiego:
find . -iname "*.mov" -printf "%p %f\n" | xargs ffmpeg -i {param1} -f flv {param2}
W jaki sposób mogę to zrobić?
command-line
bash
xargs
command-line-arguments
kissgyorgy
źródło
źródło
xargs
ogólnie mogą chcieć sprawdzić stackoverflow.com/questions/3770432/… .Odpowiedzi:
Coś takiego zrobi lewę i zachowa pełną ścieżkę, obsłuży przestrzeń, zmieni nazwę
folder/movie.mov
nafolder/movie.flv
itp.A jeśli cię źle zrozumiałem i chcesz wszystkie filmy .flv w bieżącym katalogu, użyj tego:
źródło
Powodem, dla którego ludzie używają
xargs
w połączeniu z find, jest to, że wiele nazw plików zostanie przekazanych do tego samego wywołania programu niezależnie odxargs
uruchomionego programu . Na przykład, jeślifind
zwraca pliki foo , bar i baz , następujące działania będą działaćmv
tylko raz:Skutecznie wywołuje
mv
następujące czynności:Jeśli nie potrzebujesz lub nie chcesz tego zachowania (jak zakładam, tak jest tutaj), możesz po prostu użyć
find
's'-exec
.W takim przypadku łatwym rozwiązaniem byłoby napisanie krótkiego skryptu powłoki, takiego jak:
Zapisz jako
myffmpeg.sh
i uruchomchmod +x myffmpeg.sh
. Następnie uruchom następujące polecenie:Spowoduje to wywołanie skryptu powłoki raz dla każdego znalezionego pliku. Z kolei skrypt powłoki wyodrębnia nazwę pliku z pełnej ścieżki i wywołuje
ffmpeg
z odpowiednimi argumentami.źródło
Nie uzyskałem oczekiwanego przeze mnie rozwiązania, więc odkryłem swoje. @ Odpowiedź Daniela jest dobra, ale wymaga skryptu powłoki. Jedna linijka jest szybsza i bardziej mi się podoba :) również prostsze rozwiązanie niż pisanie skryptu.
Mógłbym użyć jednego argumentu i przetworzyć go za
basename
pomocąsh -c
-I informuje xargs, aby zastąpił
{}
bieżącym argumentem.Dane wyjściowe polecenia wewnątrz `` wydrukowane na standardowe wyjście (funkcja bash), więc
basename {}
zostaną ocenione jako sama nazwa pliku i wydrukowane.-0 do prawidłowej obsługi specjalnych nazw plików, ale musisz przekazać parametry z opcją -print0 z find
źródło
Musisz zrobić to tak, jak wszystkie odpowiedzi tam, ale DOKŁADNE użycie xargs będzie takie:
W twoim przypadku będzie to:
PS: To odpowiada na pytanie o xargs dla tych, którzy szukają odpowiedzi dokładnie dla wielu
xargs
parametrów w jednymxargs
poleceniu.źródło
Dlaczego po prostu nie przesunąć opcji ffmpeg, aby pasowały do formatu wyników polecenia find ?
Zwróć uwagę na dodanie opcji -r do xargs, aby zapobiec uruchomieniu ffmpeg, jeśli nie zostaną znalezione żadne pliki .mov .
Dodałem N2 opcję xargs , aby ograniczyć liczbę elementów xargs procesów do dwóch naraz. W tym przypadku elementami są ścieżka do pliku i nazwa pliku. Jeśli nie zostanie ustawiona opcja -n , xargs przetworzy jak najwięcej elementów wejściowych w jednym wykonaniu.
źródło
Nie jestem pewien, czy możesz i jak to zrobić za pomocą xargs.
Ale coś takiego powinno ci działać:
źródło
Alternatywa dla odpowiedzi Zoredache'a przy użyciu wiązania nazw (i przy użyciu różnych separatorów, aby uniknąć problemów ze spacjami w nazwach plików):
Oczywiście można również użyć separatorów z
find -a array
argumentem, którego użyła druga odpowiedź, ale czasami nazwane argumenty są bardziej zrozumiałe.źródło
Możesz uruchomić ffmpeg bezpośrednio z polecenia find w następujący sposób:
Zwróć uwagę na cudzysłowy wokół parametrów ffmpeg, na wypadek, gdy w nazwie pliku znajdują się spacje, a średnik, który uciec, oznacza koniec wykonanego polecenia.
źródło