1
votes

Comment utiliser la commande linux find pour remplacer les caractères spéciaux dans tous les noms de fichiers?

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 :


1
votes

"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" ;' \;


2 commentaires

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.



0
votes

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)"' {} \;


0 commentaires

1
votes

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"


0 commentaires