Comment créer un fichier txt à partir de find avec les noms de fichiers et le nom de fichiers remplacés par tous les [a-yA-Y]

0

Je voudrais demander un one-liner UNIX pour ce faire

Je comprends les noms de fichiers, find . -type f > filenames.txtmais je voudrais un fichier texte ressemblant à ceci:

   filename;filenamekey
   ./fn123456789X-5.txt;./123456789X5.

le deuxième champ doit être le nom du fichier remplacé par tous les caractères ([a-yA-Y] mais les chiffres. La raison en est que ce champ contient des ISBN (comprend 0-9 et X), ce qui correspond à ma clé.

alors je recherche dans filenamekey comme ceci Select filename from books where filenamekey like '%123456789X%';

Dans les noms de fichiers, il n'est pas nécessaire qu'il y ait un ISBN, mais c'est possible. Dans le cas d'aucun ISBN, la clé doit être vide ou indésirable.

J'ai essayé ceci:

    find . -type f > filenames1.txt
    cat filename1.txt | sed -e 's/[^0-9X\/\.]//g' > filenamekey1.txt
    paste filename1.txt filenamekey1.txt | awk '{print $1,$2}'       

Y aurait-il un one-liner sophistiqué?

Merci beaucoup!

Walter Schrabmair
la source
Veuillez noter que superutilisateur.com n'est pas un service gratuit de rédaction de scripts / codes. Si vous nous dites ce que vous avez essayé jusqu'à présent (inclure les scripts / codes que vous utilisez déjà) et où vous êtes bloqué, nous pouvons essayer de vous aider avec des problèmes spécifiques. Vous devriez également lire Comment poser une bonne question? .
DavidPostill
d'accord David, je ne l'ai fait que pour les noms de fichiers et j'ai effectué le travail de remplacement dans mon programme Delphi. Comme je ne suis pas si familier avec les lignes unix, cela pourrait être un moyen plus sophistiqué de le faire avant d’importer le fichier txt dans ma table MYSQL. Je pourrais le faire en plusieurs étapes, comme créer les noms de fichiers complets, le placer dans un fichier, puis le traiter à nouveau en ajoutant les noms de fichiers et le placer dans un autre fichier. Mais je suis sûr que certains monstres intelligents peuvent le faire avec une seule ligne unix.
Walter Schrabmair
Vous pouvez le faire de deux manières fondamentales. (1) find . -type f -exec command parameters {} parameters \;, où commande et paramètres correspondent au traitement dont vous avez besoin et à chaque nom de fichier trouvé remplacé {}(qui peut être répété jusqu'à la fin \;). S'il est plus complexe, vous pouvez incorporer les commandes dans un script et le transmettre en {}tant que paramètre. (2) find . -type f | while read name; do commands ... ; done, où les commandes utilisent "$name"pour chaque fichier trouvé.
AFH
@AFH merci beaucoup. J'ai essayé cela maintenant mais le deuxième champ me manque. find . -type f | while read name; do echo $name | sed -e 's/[^0-9\/\.]//g' | awk '{print $1,";",$2}' ; done Une idée, qu'est-ce qui ne va pas?
Walter Schrabmair
J'ai trouvé mon erreur: j'ai essayé ceci maintenant:find . -type f | while read name; do ohne="$(sed -e 's/[^0-9X\/\.]//g' <<< $name)"; echo $name,";",$ohne; done
Walter Schrabmair

Réponses:

1

Tu pourrais essayer sed:

find . -type f | sed 'h;s/[^0-9X\/\.]//g;H;x;s/\n/;/'
Michael Vehrs
la source
MERCI BEAUCOUP, c'était ce que je cherchais. Intelligent, court et sophistiqué!
Walter Schrabmair
Encore une question: Comment dois-je modifier votre one-liner pour que je veuille extraire ceci du flair: vous "./123456789XTest";./123456789Xvoyez que le premier champ est cité par "MERCI BEAUCOUP!"
Walter Schrabmair
essayersed 'h;s/[^0-9X\/\.]//g;H;x;s/^/"/;s/\n/";/'
Michael Vehrs
0

essayer

find . -type f | sed 's/[-a-zA-Z\.\/]//g'' > filenames.txt
Eugen Rieck
la source
Je pense que le nom de fichier.txt ici n'est qu'une colonne. J'ai besoin de 2 colonnes d'abord le nom de fichier intact et ensuite le nom de fichier sed-ed.
Walter Schrabmair