2017-10-19 32 views
0

J'ai essayé:trouver -exec lorsqu'il est utilisé avec sed pour renomme le fichier ne fonctionne pas

find dev-other -name '*.flac' -type f -exec echo $(echo {} | sed 's,^[^/]*/,,') \; 

-je voir une liste de chemins à .flac fichiers dans dev-other, mais sans préfixé dev-other/, par exemple:

4515/11057/4515-11057-0095.flac 
4515/11057/4515-11057-0083.flac 
4515/11057/4515-11057-0040.flac 
4515/11057/4515-11057-0105.flac 
4515/11057/4515-11057-0017.flac 
4515/11057/4515-11057-0001.flac 

Au lieu de cela, je vois

dev-other/4515/11057/4515-11057-0095.flac 
dev-other/4515/11057/4515-11057-0083.flac 
dev-other/4515/11057/4515-11057-0040.flac 
dev-other/4515/11057/4515-11057-0105.flac 
dev-other/4515/11057/4515-11057-0017.flac 

Pourquoi pas th e sed remplacer travailler ici, même si elle fonctionne sur ses propres

$ echo $(echo dev-other/4515/11057/4515-11057-0047.flac | sed 's,^[^/]*/,,') 
4515/11057/4515-11057-0047.flac 

j'ai essayé avec des extensions:

find dev-other -name '*.flac' -type f -exec a={} echo ${a#*/} \; 

mais nous avons eu les erreurs:

find: a=dev-other/700/122866/700-122866-0001.flac: No such file or directory 
find: a=dev-other/700/122866/700-122866-0030.flac: No such file or directory 
find: a=dev-other/700/122866/700-122866-0026.flac: No such file or directory 
find: a=dev-other/700/122866/700-122866-0006.flac: No such file or directory 
find: a=dev-other/700/122866/700-122866-0010.flac: No such file or directory 
+0

question intéressante, et la réponse des raisons pour lesquelles 'sed' fonctionne pas est probablement ici, https://stackoverflow.com/questions/4793892/recursively-rename-files-using -find-and-sed – CWLiu

Répondre

0

Vous pouvez juste utilisez l'extension de paramètre pour votre cas d'utilisation lorsque vous utilisez find avec leOption,

find dev-other -name '*.flac' -type f -exec bash -c 'x=$1; y="${x#*/}"; echo "$y"' bash {} \; 

J'ai utilisé une enveloppe séparée (usage bash ou sh) en utilisant bash -c car pour impliquer des opérations de chaîne distinctes impliquant l'expansion des paramètres. Pensez à chaque résultat du résultat find pour être passé en argument à cette sous-shell où cette manipulation a lieu.

Lorsque bash -c exécute une commande, l'argument suivant après la commande est utilisée comme $0 (le script dans la liste des processus « nom » de), et les arguments suivants deviennent les paramètres de position ($1, $2, etc.). Cela signifie que le nom de fichier passé par trouver (à la place du {}) devient le premier paramètre du script -- et est référencé par $1 à l'intérieur du mini-script

Si vous ne souhaitez pas utiliser un bash supplémentaire, l'utilisation _ en place

find dev-other -name '*.flac' -type f -exec bash -c 'x=$1; y="${x#*/}"; echo "$y"' _ {} \; 

_ i est un bash variable prédéfinie (non défini dans dash par exemple): « au démarrage de la coquille, défini sur le chemin de nom absolu utilisé pour invoquer le shell ou du script en cours d'exécution transmis dans l'environnement ou la liste des arguments "(Voir l'article man bash - Special Parameters section)

intéressant de regarder Using Find - Complex Actions

+1

Pourquoi pas juste ... -exec sh -c 'echo "$ {1 # * /}"' sh {} \; '? Vous n'avez pas besoin de tant de variables auxiliaires ... –

+0

@gniourf_gniourf: Oui, mais j'arguerais en utilisant une variable supplémentaire, je pourrais démontrer comment la sortie de find est analysée dans le sous-shell comme $ 1. Il pourrait encore être évité cependant;) – Inian