1
votes

Modification des noms de fichiers contenant des caractères spéciaux dans bash

Nous utilisons un serveur Ubuntu qui envoie automatiquement les fichiers FTP d'un client et ces fichiers, ces derniers temps, apparaissent maintenant sous le nom de ... 'file.csv;' 'file2.csv;

J'ai essayé, sans succès, de formuler des solutions bash et Python sans succès. J'essaie simplement de supprimer les guillemets simples et les points-virgules et de conserver ce qui reste. Cela n'a pas besoin d'être bash, cela pourrait être python ou même perl. J'ai inclus ci-dessous le code de ce qui ne fonctionne pas. Je n'arrive même pas à obtenir une liste d'annuaire. Est-ce que quelqu'un peut-il me montrer la bonne direction?

for i in \'* 
    do
    echo $i
done

Remarque: code corrigé pour supprimer $ echo 'errant


1 commentaires

utilisez shellcheck.net . Si vous collez votre code avec le bon shebang, cela vous indique que vous essayez d'utiliser echo comme variable, ce qui n'est probablement pas ce que vous voulez.


3 Réponses :


1
votes

Utilisez find ... -exec rename comme ceci:

conda install rename

Exemple:

find ... -print0 | xargs -0 ...

Vous pouvez également renommer en bloc pour la vitesse à l'aide de xargs , tels que

# Create example input files:
$ touch "f'o''o'" "b;a;;r;" "b';a;'';z;'"

# Build the command by first confirming that `find` finds them all:
$ find . -name "*[;']*"                            
./f'o''o'
./b';a;'';z;'
./b;a;;r;

# Find and rename them, one by one:
$ find . -name "*[;']*" -exec rename "tr/';//d" {} \;

# Confirm that rename worked as expected:
$ ls -1rt | tail -n 3                                
foo
bar
baz

mais dans votre cas, je suppose que renommer les fichiers un par un est assez rapide.


Le rename utilitaire de ligne de commande se présente sous de nombreuses formes. La plupart d'entre eux devraient travailler pour cette tâche. J'ai utilisé la rename la version 1.601 par Aristote Pagaltzis. Pour installer rename , téléchargez simplement son script Perl et placez-le dans $PATH . Ou installez rename utilisant conda , comme ceci:

find . -name "*[;']*" -exec rename "tr/';//d" {} \;


2 commentaires

vous pouvez les renommer puis faire le travail google.com/amp/s/www.geeksforgeeks.org/...


Brillant! Je ne peux pas vous remercier assez ... JW



0
votes
import os
filesInDirectory = os.listdir(Path)

for filename in filesInDirectory:
    if "'" in filename:
        filename.replace("'", "")
    elif ";" in filename:
        filename.replace(";", "") 
    elif ("'" and ";") in filename:
        filename.replace("'", "")
        filename.replace(";", "")
Using Python

0 commentaires

0
votes

Vous pouvez commencer par essayer ce script pyhon 3. Je l'ai testé uniquement sous Windows.

import os

folder = ""
for root, dirs, files in os.walk(folder, topdown=False):
    for fn in files:
        path_to_file = os.path.join(root, fn)
        if "'" in fn or ";" in fn:
            print('Removing special characters from file: ' + fn)
            new_name = fn.replace("'", '').replace(";", '') 
            os.rename(path_to_file, os.path.join(root, new_name))


0 commentaires