„Brak takiego pliku lub katalogu” podczas konwersji filmów do nowej struktury folderów

0

Próbuję skopiować duże archiwum filmów (siedząc w podfolderach) do równoległej struktury folderów, konwertując wideo z mov na mp4 (plus kilka innych poprawek). To jest polecenie:

for f in Users/me/VIDEOARCHIVE/*/*.mov; do ffmpeg -i "$f" "Users/me/CONVERTED/${f%.mov}.mp4"; done

Jednak otrzymuję „brak takiego pliku lub katalogu” dla pliku wyjściowego. Wiem, że na tej stronie jest wiele podobnych pytań, ale żaden z nich nie był pomocny w moim scenariuszu.
Próbowałem też wcześniej utworzyć pustą strukturę folderów, tak że musiałbym tylko utworzyć plik .mp4, ale nadal pojawia się ten sam błąd.

Działa, gdy wcześniej utworzono (pustą) strukturę folderów. Ale gdy tylko brakuje folderu, otrzymuję „brak takiego pliku lub katalogu”.

Czy istnieje sposób, aby powiedzieć mu, aby tworzył foldery nadrzędne, jeśli musi, aby mógł umieszczać w nich pliki?

jan
źródło
3
Próbowałeś debugowania za pomocą set -x wcześniej lub echo "Users/me/CONVERTED/${f%.mov}.mp4" wewnątrz pętli? To powinno dać ci jakąś wskazówkę.
Kamil Maciorowski
ffmpeg może mieć problemy z długimi nazwami plików lub ścieżkami lub ze spacjami. Wypróbuj krótszy.
DrMoishe Pippik
@KamilMaciorowski Dziękuję, umieściłem równoległą strukturę folderów w niewłaściwym miejscu ... moje złe: P Ale wciąż zastanawiam się, dlaczego ffmpeg nie twórz folderów, jeśli trzeba (odpowiednio przeredagowałem moje pytanie).
jan
Wygląda jak ffmpeg nie tworzy katalogów podczas wysyłania. W Twoim do zapętlić przed twoim ffmpeg wywołać ścieżkę katalogu, który będzie zawierał plik wyjściowy, i mkdir -p to. Opcjonalnie sprawdź istnienie przed próbą utworzenia.
ivanivan

Odpowiedzi:

3

Czy istnieje sposób, aby powiedzieć mu, aby tworzył foldery nadrzędne, jeśli musi, aby mógł umieszczać w nich pliki?

ffmpeg? Nie. Nie tworzy folderów samodzielnie. Właściwie robi to bardzo niewiele programów.

Jakieś sugestie:

  • Powinieneś wcześniej utworzyć folder.
  • Musisz użyć podstawowej nazwy pliku, jak $f zawiera już pełną ścieżkę do pliku.
  • Powinieneś użyć rekurencyjnego globbowania dla swojego archiwum wideo ( **/* ) do przechodzenia przez wszystkie katalogi.

Łącząc to:

# enable recursive globbing
shopt -s globstar
# create the directory if necessary
dir="/Users/me/CONVERTED/"
mkdir -p "$dir"
# iterate over all files
for f in /Users/me/VIDEOARCHIVE/**/*.mov; do
    # get the file's basename
    fname="$(basename "$f")"
    # run the command, replacing the file extension
    ffmpeg -i "$f" "$dir/${fname%.mov}.mp4"
done
slhck
źródło
Eh, przepraszam, wziąłem to z pętli użytkownika, nie zauważając, że nawet jeśli ffmpeg był w stanie tworzyć foldery wyjściowe, kod jest błędny. Pozwól mi to naprawić.
slhck