Get first two strings of each filename in a directory as a txt file

2

1

I need to clean up strings like this (where I read in a group of image names), where I only want the first two strings (currently I'm using, in Windows 7 cmd line - dir /a/b/p > textfile.txt):

  • Acaena inermis no barbs dbot_25Dec15_40.JPG
  • Coprosma Taiko PB121944 invbot.rs.JPG
  • Cortaderia richardii InvBot P6260038.JPG
  • Anemanthele lessoniana LIC.nestmaker.CC BY-SA 2.0.jpg
  • Myosotidium hort ibot PB109882 sqr rs.JPG

to look like this (Word space word and strip the rest):

  • Acaena inermis
  • Coprosma Taiko
  • Cortaderia richardii
  • Anemanthele lessoniana
  • Myosotidium hort

Is there a way using either cmd or batch to simplify this? Normally there would be 15 files parsed each time I do this. I'm hardly a cmd-line guru!

nigelc

Posted 2016-05-10T07:14:02.747

Reputation: 167

Just to clarify things, are you looking to rename files to word space word? without the extension even? – LPChip – 2016-05-10T07:37:33.867

Possible duplicate of How can I mass rename files?

– LPChip – 2016-05-10T07:38:55.633

One of the answers lists PowerGrep which seems to also replace regex inside files. That's one you may want to use, or use something like Notepad++ where you can find/replace using regex inside a textfile. – LPChip – 2016-05-10T07:43:31.150

Thanks very much LPChip, I'll look at these tomorrow and get back here – nigelc – 2016-05-10T08:18:24.633

Can you show us what you've tried with the batch file? – Dave – 2016-05-10T08:25:21.587

Answers

2

Try this from command line:

for /F "tokens=*" %g in (textfile.txt) do @for /F "tokens=1,2" %G in ("%~ng") do @if not "%H"=="" echo(%G %H

or start from scratch

for /F "tokens=*" %g in ('dir /A/B/S') do @for /F "tokens=1,2" %G in ("%~ng") do @if not "%H"=="" echo(%G %H

You need to double % percent signs in for loop variable names in a batch file as follows:

@echo OFF
for /F "tokens=*" %%g in (textfile.txt) do (
    for /F "tokens=1,2" %%G in ("%%~ng") do if not "%%H"=="" echo(%%G %%H
)

or

@echo OFF
for /F "tokens=*" %%g in ('dir /A/B/S') do (
    for /F "tokens=1,2" %%G in ("%%~ng") do if not "%%H"=="" echo(%%G %%H
)

To redirect output to a plain text file taxons.txt (note additional () parentheses:

>taxons.txt (for /F "tokens=*" %g in ('dir /A/B/S') do @for /F "tokens=1,2" %G in ("%~ng") do @if not "%H"=="" echo(%G %H)

or in a batch script:

@echo OFF
>taxons.txt (
for /F "tokens=*" %%g in ('dir /A/B/S') do (
    for /F "tokens=1,2" %%G in ("%%~ng") do @if not "%%H"=="" echo(%%G %%H
)
)

Resources (required reading):

JosefZ

Posted 2016-05-10T07:14:02.747

Reputation: 9 121

Thanks very very much JosephZ, that probably saves me half an hour a day! and it does everything at the start in cmd.

I used your "start from scratch" line and added >> textfile2.txt – nigelc – 2016-05-10T19:06:09.833

graphical result - [link] (http://i.imgur.com/nZS7HEi.jpg)_italic_ bold code

– nigelc – 2016-05-10T19:25:51.617

1

Download the free text editor called Notepad++

Open your textfile.

Press CTRL-H to open the find and replace dialog.

At the bottom left, check Regular Expression

In Find: enter ^(.+?[ ].+?)[ ].+$ In Replace: enter $1

This code will assume that after the 2nd word a space is present. If there is another char there, such as a _ or - replace the second [ ] with [ _-] (listing whatever char there is). Keep in mind that if you have this text part as the word too, it will cut off there in other searches.

LPChip

Posted 2016-05-10T07:14:02.747

Reputation: 42 190

And thanks for giving me a simple intro to Regular Expression in N++ – nigelc – 2016-05-10T19:07:04.707