Je souhaite remplacer tous les caractères spéciaux (c'est-à-dire _?: /) (\ - \ n \ t)
dans le nom de tous les fichiers pdf par un espace.
Je n'ai pas pu pour ce faire, j'ai juste essayé de les supprimer en utilisant cette commande.
Pour certaines raisons, cette commande fonctionne parfois pour un cas de test, mais pas pour d'autres. Cela donne l'erreur mv: la cible n'est pas un répertoire, et le nom des fichiers d'entrée et cible sont également identiques (si aucun caractère spécial à supprimer).
a bc de fg .pdf
Je m'attends à changer nom de fichier:
a:bc-de_(fg).pdf
À être
find . -name '*.pdf' -exec sh -c 'if="{}"; of=$(echo $if|tr -d '_:-' ); mv $if $of ;' \;
3 Réponses :
"mv: target n'est pas un répertoire" est dû aux espaces dans le nom de fichier, et peut être corrigé en mettant le nom du fichier entre guillemets.
Essayez ceci
find . -name '*.pdf' -exec sh -c 'if="{}"; of=$(echo $if|tr "()_:-" " " ); mv "$if" "$of" ;' \;
Inclure $ of avec une citation aide, mais mv ne donne pas d'erreur de dictionnaire. En incluant à la fois $ if et $ of, cela fonctionne. Merci
Même si vous doublez les références à $ if
, cela posera toujours des problèmes avec les noms de fichiers contenant des guillemets doubles, des signes dollar, des contre-obliques ou des contre-obliques, car ceux-ci ne sont pas sûrs dans l'original < code> if = "{}" affectation.
Vous pouvez également utiliser sed:
$ ls 'a bc de fg .pdf' 'f sc de fg .pdf' somefile
exemples de fichiers:
$ ls 'a:bc-de_(fg).pdf' 'f:sc-de_(fg).pdf' somefile
fichiers de sortie:
find . -name '*.pdf' sh -c 'mv "$0" "$(sed "s/[-_:()]/ /g" <<< $0)"' {} \;
Juste plus efficace,
find ~+ -regextype awk -iregex '.*/[^/]*[-_:()\t][^/]*\.pdf' -exec sh -c 'mv "{}" "`echo "{}"|sed -E "s/[-_:\(\)\t]+/ /g"`"' \;
renomme également un tel: bc -_: d en "a bc d"
Voir BashFAQ # 20: "Comment puis-je trouver et gérer en toute sécurité les noms de fichiers contenant des nouvelles lignes, des espaces ou les deux?" < / a> et BashFAQ # 30: "Comment puis-je renommer tous mes fichiers * .foo en * .bar, ou convertir les espaces en traits de soulignement ou convertir les noms de fichiers en majuscules en minuscules? ".