si trouver ext alors cp parent dir sinon echo non trouvé


1

Jusqu'à présent, je suis venu avec cela.

if ls -1 ~/Downloads/*.mkv >/dev/null 2>&1
then
        echo 1
else
        echo 0
fi

Mais ce que je voudrais faire est de copier ensuite le répertoire parent du fichier trouvé vers un autre emplacement.

J'ai le sentiment que je devrais utiliser la commande find.


Pouvez-vous décrire ce que vous devez vraiment accomplir? Si un dossier contient un .mkv vous voulez copier le dossier ailleurs?
slhck

@slhck Oui, c'est ce que j'aimerais faire.
David Custer

Réponses:


1

La réponse de fede.evol échoue si les chemins contiennent des espaces. La sortie de find ou ls ne devrait pas être utilisé dans une substitution de commande .

La manière appropriée de traiter tous les noms de fichiers (à l'exception des chemins avec des nouvelles lignes) serait la suivante:

find /somewhere -name "*.mkv" -exec dirname {} \; | uniq | \
while IFS= read -r dir; do echo cp -- "$dir" /other/; done

De cette façon, chaque dossier de /somewhere est copié dans /other/. Notez que la fin de la barre oblique est obligatoire, car sinon la cible serait toujours remplacée.


1

Utilisation dirname FILE pour obtenir le nom de répertoire d'un fichier donné. Donc par exemple:

find DIRECTORY -name "*.mkv" -exec dirname {} \;

Vous donnera tous les répertoires avec un MKV sous RÉPERTOIRE. Ensuite, vous pouvez les passer à travers uniq ne pas obtenir des doublons et puis en cas de copie.

Par exemple

cp -a `find DIRECTORY -name "*.mkv" -exec dirname {} \; | uniq` DESTDIR

Votre dernière commande échouera si le chemin du répertoire contient des espaces. Vous ne devez pas utiliser la substitution de commande sur find ou ls sortie.
slhck
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.