Je voudrais demander un one-liner UNIX pour ce faire
Je comprends les noms de fichiers, find . -type f > filenames.txt
mais 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!
command-line
bash
unix
Walter Schrabmair
la source
la source
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é.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?find . -type f | while read name; do ohne="$(sed -e 's/[^0-9X\/\.]//g' <<< $name)"; echo $name,";",$ohne; done
Réponses:
Tu pourrais essayer
sed
:la source
"./123456789XTest";./123456789X
voyez que le premier champ est cité par "MERCI BEAUCOUP!"sed 'h;s/[^0-9X\/\.]//g;H;x;s/^/"/;s/\n/";/'
essayer
la source