Batch Finding and displaying duplicate strings in file names - batch-file

I have a question. Is it possibile in batch language to search in folder a part of name that is same like another file and display it.For example i got folder with files :
ggggggsss.mp3
ddddddeee.mp3
ddddddff.mp3
ssssssddd.mp3
aaaaasssss.mp3
11111ssdas.mp3
11111dddd.mp3
...
I need to display in cmd only names of files
ddddddeee
ddddddff
and
11111ssdas
11111dddddd
Because the first six letter are the same. Could someone help me with this problem?

Save this script to test.bat and run from open Cmd Prompt. Replace dir value with path to your folder with .mp3 files:
#echo off
setlocal enabledelayedexpansion
set "dir=%userprofile%\music"
set "pattern1=dddddd" & set "pattern2=11111"
pushd "%dir%"
FOR %%G IN (*.mp3) DO ( set song=%%G
if "!song:~0,6!"=="%pattern1%" echo %%G)
echo/
FOR %%G IN (*.mp3) DO ( set song=%%G
if "!song:~0,5!"=="%pattern2%" echo %%G)
popd
exit /b
See also Extract Substrings.

Related

Copy one file to one folder at a time where there are 100 files and 100 folders to copy using Batch file

I have two folders CopyFrom and CopyTo where CopyFrom has 100 text files named as 1.txt…100.txt and in CopyTo folder I have 100 folders as F1…F100. Now, I want to copy one file from CopyFrom folder to one folder in CopyTo so that F1 will contain 1.txt, F2 will contain 2.txt,…, F100 will contain 100.txt file.
I know to copy all folders I can use something like For /d %%a in (C:\Users\me\Desktop\ShortCuts\*) do xcopy "C:\Users\me\Desktop\Time.xls" "%%a", but I could not find a way to copy different files to different folders.
I can echo all the files (For %%a in (C:\Users\me\Desktop\ShortCuts\*) Echo "%%a") in the CopyFrom folder and also can Echo all the folders in CopyTo folder but could not figure out to working with both to get what I am looking for.
#echo off
setlocal enableextensions disabledelayedexpansion
rem Configure paths
set "copyFrom=c:\somewhere"
set "copyTo=c:\anotherPlace"
rem Generate two lists, one with files and one with folders
dir /b /a-d "%copyFrom%\*" > "%temp%\copyFromFiles.txt"
dir /b /ad "%copyTo%\*" > "%temp%\copyToFolders.txt"
rem Assign each list as input to two streams and start processing
9< "%temp%\copyFromFiles.txt" 8< "%temp%\copyToFolders.txt" (
call :matchFromWithTo
)
rem Remove generated lists
del "%temp%\copyFromFiles.txt"
del "%temp%\copyToFolders.txt"
rem End
goto :eof
:matchFromWithTo
rem Read file from stream 9 and leave if nothing read
<&9 set /p "file=" || goto :eof
rem Read folder from stream 8 and leave if nothing read
<&8 set /p "folder=" || goto :eof
rem Do the copy (debug: we will only echo the command)
echo copy "%copyFrom%\%file%" "%copyTo%\%folder%"
rem Keep reading until all files or folders are processed
goto :matchFromWithTo
Supposing the source location contains the files 1.txt to 100.txt only and the target location already contains all the F1 to F100 directories, the following code snippet might work for you:
#echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "Pattern=*.txt"
set "CopyFrom=."
set "CopyTo=D:\Target"
for %%F in ("%CopyFrom%\%Pattern%") do (
ECHO copy "%%~F" "%CopyTo%\F%%~nF\"
)
endlocal
exit /B
There is no enumeration of the target location done, the copy destination is simply derived from the source file name.
After having tested the script, remove the upper-case ECHO command to actually copy files!

how to bookmark and delete the line for multiple files

I want to book mark and delete the lines from the multiple XML files. I'm new to batch file programming. Could any one pls help me to create the batch file which should read the file and delete the line which contains the string.
Eg: Below is the content of one XML file in which i want to delete the lines which contains "cimage.gif" and "appcover".
<file>/cimages/ncomms_cimage.jpg</file>
<file>/ncomms/2014/141223/ncomms6646/abs/ncomms6646.html</file>
<file>/ncomms/2014/141223/ncomms6646/carousel/ncomms6646-f1.jpg</file>
<file>/ncomms/2014/141223/ncomms6646/carousel/ncomms6646-f2.jpg</file>
<file>/ncomms/2014/141223/ncomms6646/carousel/ncomms6646-f3.jpg</file>
<file>/ncomms/2014/141223/ncomms6646/carousel/ncomms6646-f4.jpg</file>
<file>/ncomms/2014/141223/ncomms6646/carousel/ncomms6646-f5.jpg</file>
<file>/ncomms/2014/141223/ncomms6646/carousel/ncomms6646-f6.jpg</file>
<file>/ncomms/2014/141223/ncomms6646/compound/ncomms6646_ci.html</file>
<file>/ncomms/2014/141223/ncomms6646/covers/appcover-ncomms-v5-ncomms6646-150x193.png</file>
<file>/ncomms/2014/141223/ncomms6646/covers/appcover-ncomms-v5-ncomms6646-450x579.png</file>
<file>/ncomms/2014/141223/ncomms6646/covers/appcover-ncomms-v5-ncomms6646-75x100.png</file>
<file>/ncomms/2014/141223/ncomms6646/extref/ncomms6646-s1.pdf</file>
<file>/ncomms/2014/141223/ncomms6646/extref/ncomms6646-s2.xls</file>
<file>/ncomms/2014/141223/ncomms6646/extref/ncomms6646-s3.xls</file>
<file>/ncomms/2014/141223/ncomms6646/extref/ncomms6646-s4.avi</file>
<file>/ncomms/2014/141223/ncomms6646/fig_tab/ncomms6646_F1.html</file>
<file>/ncomms/2014/141223/ncomms6646/fig_tab/ncomms6646_F2.html</file>
<file>/ncomms/2014/141223/ncomms6646/fig_tab/ncomms6646_F3.html</file>
<file>/ncomms/2014/141223/ncomms6646/fig_tab/ncomms6646_F4.html</file>
<file>/ncomms/2014/141223/ncomms6646/fig_tab/ncomms6646_F5.html</file>
I want to delete both line which contains "appcover" and "cimage"
Coudld you pls update the code n give me? Sorry since Iam new to batch file i'm depending on your coding only.
Also If i want to edit the 10 files i cant put all xmls in one folder since the filename of the all xmls will be pushlive-manifest.xml only, all these files are stored in a their own diretories. Is any way to put this batch file in route folder adn it should read the xmls in the sub-directories with in the root folder.
Eg: route dir path is:D:/abc the xmls are in "D:/abc/123", "D:/abc/121" "D:/abc/125" and so on.
So i can place the batch file in D:/abc folder and if i run batch file it should read the xmls wch are there in "D:/abc/123", "D:/abc/121" "D:/abc/125" and so on.
Expecting your reply on this!
I changed the coding as below:
#ECHO OFF
SETLOCAL
SET "sourcedir=D:\test"
FOR /r "%sourcedir%" %%a IN (pushlive-manifest*.xml) DO (
FINDSTR /v /L "cimage.jpg appcover" "%%a" >"%%~dpna.txt"
move /y "%%a" "%%~na"
)
GOTO :EOF
and as a result it is not processinfg other xmls but it just creates one txt for each xml in its dir. and the out file is not overwiting the original xml it is still generating txt file. this time it is not creating copy of input xml to txt file where as as it is deleting the expecte dlines in the xml and converting it into txt. PLs suggest
#ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
FOR %%a IN ("%sourcedir%\*.xml") DO (
FINDSTR /v /L "cimage.gif appcover" "%%a" >"%%~dpna.txt"
)
GOTO :EOF
You would need to change the setting of sourcedir to suit your circumstances.
A new file is generated called samebasename.txt in the same directory as the directory scanned. It's not clear whether you want to delete lines that contain either "cimage.gif" **OR** "appcover" or those that contain both "cimage.gif" and "appcover". This code assumes the former.
Revision for revise requirement : search for .xmls in tree
#ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
FOR /r "%sourcedir%" %%a IN (*.xml) DO (
FINDSTR /v /L "cimage.gif appcover" "%%a" >"%%~dpna.txt"
)
GOTO :EOF
Note that in the Windows world, \ is a directory-separator and / is a switch-indicator. Windows often, but not always, makes the translation. Best to use the correct form.
#ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
FOR /r "%sourcedir%" %%a IN (pushlive-manifest*.xml) DO (
FINDSTR /v /L "cimage.gif appcover" "%%a" >"%%~dpna.LMX"
Move /y "%%~dpna.LMX" "%%~nxa"
)
GOTO :EOF
This should work for you - just change the directory-name as required

Using batch files to remove a single number from a folder name

At work we use a bespoke program to search through a directory tree and find an individual image file. These files are stored in folders that have a 7-digit name, starting with '18' - so for instance '1873456', '1873457', '1873458' etc. The problem I have is at some point last year the procedure that creates these folders and populates the images in them reached '1899999' - and then rolled over to '18100000' and carried on like that for over 4,000 folders before it was caught and corrected.
The bespoke program we use can only handle seven-digit folder names. What I would like to do is create a batch file that renames all the eight-digit folders by removing the extra '1' in the name, so '18100000' becomes '1800000' and so forth until '18104013' becomes '1804013'.
Can anyone help?
Run this in the base folder, it will not change any folders.
A file called renfile.bat.txt will be created that contains the rename command for the folders that match the filespec. Examine it in notepad to see if it is ok and then rename it to renfile.bat and run it.
It's not tested.
#echo off
setlocal enabledelayedexpansion
for /d /r %%a in (18??????) do (
set "name=%%~nxa"
>>renfile.bat.txt echo ren "%%a" "!name:~0,2!!name:~3!"
)
Something like
for /l %%x in (100000,1,104013) do (
set oldsuffix=%%x
set newsuffix=%oldsuffix:~-5%
ren 18%%x 18%newsuffix%
)
setlocal enableextensions enabledelayedexpansion
for /d /r "c:\somewhere" %%f in (181?????) do (
set "name=0" & set /a "name+=%%~nf" 2>nul
if !name! gtr 1899999 ren "%%~ff" "18!name:~-5!"
)

Batch file to rename files

We have a couple of thousand files in a directory named like this:
EXP_10000021.XM_
And need to remove the leading 1 so the new file name is:
EXP_0000021.XM_
I'm no good with batch files - any help would be appreciated!
If your filenames start all with EXP_1 it's easy.
setlocal EnableDelayedExpansion
for %%A in (EXP_1*.XM_) do (
set "filename=%%A"
set "newName=EXP_!filename:~5!"
rem ** remove the ECHO when it seems to work
ECHO ren !filename! !newName!
)

Iterating through folders and files in batch file?

Here's my situation. A project has as objective to migrate some attachments to another system.
These attachments will be located to a parent folder, let's say "Folder 0" (see this question's diagram for better understanding), and they will be zipped/compressed.
I want my batch script to be called like so:
BatchScript.bat "c:\temp\usd\Folder 0"
I'm using 7za.exe as the command line extraction tool.
What I want my batch script to do is to iterate through the "Folder 0"'s subfolders, and extract all of the containing ZIP files into their respective folder.
It is obligatory that the files extracted are in the same folder as their respective ZIP files. So, files contained in "File 1.zip" are needed in "Folder 1" and so forth.
I have read about the FOR...DO command on Windows XP Professional Product Documentation - Using Batch Files.
Here's my script:
#ECHO OFF
FOR /D %folder IN (%%rootFolderCmdLnParam) DO
FOR %zippedFile IN (*.zip) DO 7za.exe e %zippedFile
I guess that I would also need to change the actual directory before calling 7za.exe e %zippedFile for file extraction, but I can't figure out how in this batch file (through I know how in command line, and even if I know it is the same instruction "cd").
EDIT #1
I have already received some tips on ServerFault to the same question. Please see the answers at this link.
However, it extracted from the root (C:), and not from the given in parameter folder.
Anyone has an idea?
EDIT #2
It seems that batch script doesn't handle folder and file names containing a space character adequately. Can anyone confirm what I think?
EDIT #3
I need it to be fully recursive, since I don't know the directory structure against which this will be used.
EDIT #4.a
With #aphoria's solution, I'm almost there! The only problem is that it takes let's say File5.zip, retrieve the filename only to get File5, creates a subfolder File5 and extract the File5.zip to File5 subfolder, then, it wants to create a File5 subfolder in Folder 1, where it should instead want to create File1 subfolder, to stick with my example.
EDIT #4.b
As required, here's the code as it currently look:
#echo off
setlocal enableextensions enabledelayedexpansion
rem
rem Display instructions when no parameter is given.
rem
if "%1" equ "" (
echo Syntaxe : od.bat ^<directory mask>^
echo Exemple : od.bat *
goto :Eof
)
rem
rem Setting the PATH environment variable for this batch file for accessing 7za.exe.
rem
path=c:\temp;%PATH%
rem
rem Removing quotes from the given command line parameter path.
rem
set root=%1
set root=%root:~%1
set root=%root:~0,-1%
rem Searching directory structure from root for subfolders and zipfiles, then extracting the zipfiles into a subfolder of the same name as the zipfile.
for /F "delims==" %%d in ('dir /ogne /ad /b /s %root%') do (
echo Traitement du dossier : "%%d"
for /F "delims==" %%f in ('dir /b "%%d\*.zip"') do (
rem Getting filename without extension.
set subfolder=~n%f
mkdir "%%d\%subfolder%"
rem Extracting zipfile content to the newly created folder.
7za.exe e "%%d\%%f" -o"%%d\%subfolder%"
)
)
:Eof
endlocal
Ideas anyone?
My guess is that it digs one directory hierarchy at a time. Here's the deal. Consider we have a Folder A in Folder 1 (Folder 1\Folder A), then, it searches from Folder 1 through Folder 5, and comes back to Folder 1\Folder A, where the %subfolder% variable sticks with its last value.
Anyone's help is gratefully appreciated.
I'm not very familiar with the 7zip command-line options, so you will need to figure out the exact command for that, but the script below will take a fully specified path (spaces allowed) and print out the the folder name and .zip files contained within it.
#ECHO OFF
REM
REM Remove the double quotes from the front and end of the root path
REM
SET ROOT=%1
SET ROOT=%ROOT:~1%
SET ROOT=%ROOT:~0,-1%
ECHO %ROOT%
FOR /F "DELIMS==" %%d in ('DIR "%ROOT%" /AD /B') DO (
ECHO %%d
FOR /F "DELIMS==" %%f in ('DIR "%ROOT%\%%d\*.zip" /B') DO (
ECHO %%f
)
)
Run it like this:
MyScript.CMD "c:\temp\usd\Folder 0"
You should get output similar to this:
Folder A
File 1.zip
File 2.zip
Folder B
File 1.zip
File 2.zip
UPDATE
The code below will extract Folder A\File 1.zip to a new folder Folder A\File 1.
A few things to keep in mind:
In the first FOR loop, you need to have %ROOT% enclosed in double quotes to handle folders with spaces in the name.
Since you're SETting a variable inside the second FOR, you need to put SETLOCAL ENABLEDELAYEDEXPANSION at the beginning. Then, reference the variable using ! (for example, !subfolder!) to force expansion at runtime.
This line of your code set subfolder=~n%f should be this set subfolder=%%~nf
I put ECHO in front of the MKDIR and 7za.exe commands to test. Once you are sure it is doing what you want, remove the ECHO statement.
Here is the code:
#ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
REM
REM Remove the double quotes from the front and end of the root path
REM
SET ROOT=%1
SET ROOT=%ROOT:~1%
SET ROOT=%ROOT:~0,-1%
ECHO %ROOT%
REM Searching directory structure from root for subfolders and zipfiles,
REM then extracting the zipfiles into a subfolder of the same name as the zipfile.
FOR /F "delims==" %%d IN ('dir /ogne /ad /b /s "%ROOT%"') DO (
ECHO Traitement du dossier : "%%d"
FOR /F "delims==" %%f IN ('dir /b "%%d\*.zip"') DO (
REM Getting filename without extension.
SET subfolder=%%~nf
ECHO mkdir "%%d\!subfolder!"
REM Extracting zipfile content to the newly created folder.
ECHO 7za.exe e "%%d\%%f" -o"%%d\!subfolder!"
)
)
ENDLOCAL

Resources