2010-08-01 4 views
1

J'ai une énorme collection de vidéos qui doivent toutes être converties en mp4. La structure du dossier est comme ceciConversion de vidéos en lots dans des dossiers et sous-dossiers

Events 
    Chicago 
    Boston 
    San Fran 
    London Expo 

Chaque événement contient toutes les vidéos au format avi ou .mkv. Je veux qu'ils soient convertis au même nom de fichier. mais avec l'extension mp4.

Ma question est de savoir comment faire une boucle dans un sous-dossier de dossiers, et aussi garder les noms de fichiers parce qu'ils ont des espaces en ce moment .. Voici ce que j'ai pour le moment.

sourcedir="$1" 
destdir="$2" 
cd "$sourcedir" 
for i in `ls`; do 
    HandBrakeCLI -i "$i" -o "$destdir/${i%.*}.mp4" --preset="AppleTV" 
    echo $i 
done 

Phillips code:

cd "$sourcedir" 
echo "Directory: $sourcedir" 
destdir = sourcedir 
for subdir in * 
do 
    if [[ -d "$subdir" ]] 
    then 
    for file in "$subdir"/* 
    do 
     HandBrakeCLI -i "$file" -o "${file%.*}.mp4" --preset=AppleTV 
     echo "$file" 
    done 
    fi 
done 
+0

1. Évitez d'utiliser 'cd' sans vérification d'utilisation' set -e' ou 'cd || exit 1', ou, mieux encore, ne change pas du tout le répertoire; Sinon, votre script pourrait fonctionner dans le mauvais répertoire. 2. 'destdir = sourcedir' n'est pas une affectation mais essayera d'appeler une commande nommée' destdir'. – Philipp

Répondre

2

Utilisez une boucle imbriquée, et ne pas utiliser ls:

for subdir in "$sourcedir"/* 
do 
    if [[ -d "$subdir" ]] 
    then 
    for file in "$subdir"/* 
    do 
     HandBrakeCLI -i "$file" -o "$destdir/${file%.*}.mp4" --preset=AppleTV 
     echo "$file" 
    done 
    fi 
done 

Une autre option consiste à utiliser find:

find "$sourcedir" -maxdepth 2 -mindepth 2 -type f -exec bash -c 'HandBrakeCLI -i "$0" -o "'"$destdir"'/${0%.*}.mp4" --preset=AppleTV' '{}' ';' -print 

Les deux solutions fonctionneront avec les noms de fichiers contenant des espaces ou des sauts de ligne.

+0

Merci beaucoup ça a fonctionné parfaitement, j'avais quelques avis corrompus! –

1

Soit utiliser for i in "$sourcedir/*" (ou depuis que vous avez déjà fait un cd là, vous pouvez faire for i in *).

ou faire find "$sourcedir" -type f | while read -r i (avec cela, la i comprendra le variables nom du répertoire source, de sorte que vous aurez à la bande que de l'aide d'une attelle ou extension de basename).

0

bash 4

shopt -s globstar 
destdir="/somewhere" 
for file in **/*.mkv **/*.avi 
do 
    HandBrakeCLI -i "$file" -o "$destdir/${file%.*}.mp4" --preset=AppleTV 
done 
1

programme de changement à IVI link to iVi.

ce programme fait la trcik, encore mieux que le frein à main ...

Questions connexes