patternpythonMinor
Python script to touch files of a particular pattern in all folders of a given name
Viewed 0 times
scriptallfoldersfilesnamepythonparticulargivenpatterntouch
Problem
The intent of this script is to hunt down all
Is there a simpler way to achieve this? Specifically to perform steps (1) and (2) in a single process, rather than having to filter the matches array? An alternative solution would be to just recursively find all folders called "/testResults/" and list the files within them.
Notes:
-
This script would also find "blah/testResults/blah2/result.xml" - I'm not worried about that, as the testResults folders will only contain test result xml files (but not all xml files are test results!)
-
This runs on Windows.
"/testResults/.xml" files and touch them, so that our build system doesn't issue errors that the files are too old (it's entirely intentional that tests are only re-run when the libraries they change have been modified)import fnmatch
import os
import time
matches = []
# Find all xml files (1)
for root, dirnames, filenames in os.walk('.'):
for filename in fnmatch.filter(filenames, '*.xml'):
matches.append(os.path.join(root, filename))
# filter to only the ones in a "/testResults/" folder (2)
tests = [k for k in matches if "\\testResults\\" in k]
t = time.time()
# touch them
for test in tests:
os.utime(test,(t,t))Is there a simpler way to achieve this? Specifically to perform steps (1) and (2) in a single process, rather than having to filter the matches array? An alternative solution would be to just recursively find all folders called "/testResults/" and list the files within them.
Notes:
-
This script would also find "blah/testResults/blah2/result.xml" - I'm not worried about that, as the testResults folders will only contain test result xml files (but not all xml files are test results!)
-
This runs on Windows.
Solution
For combining (1) and (2) you can reverse the sort by only trying if your are under a test directory
Also this is a great use for a generator / map combo to avoid extra loops
Also this is a great use for a generator / map combo to avoid extra loops
import os
import re
is_xml = re.compile('xml', re.I)
is_test = re.compile('testResults', re.I)
def find_xml_tests(root):
for current, dirnames, filenames in os.walk(root):
if is_test.search(current):
for filename in filter(lambda p: is_xml.search(p), filenames):
yield os.path.normpath(os.path.join(current, filename))
def touch(filename ):
os.utime(test,(time.time(),time.time()))
map(touch, find_xml_tests('path/to/files'))Code Snippets
import os
import re
is_xml = re.compile('xml', re.I)
is_test = re.compile('testResults', re.I)
def find_xml_tests(root):
for current, dirnames, filenames in os.walk(root):
if is_test.search(current):
for filename in filter(lambda p: is_xml.search(p), filenames):
yield os.path.normpath(os.path.join(current, filename))
def touch(filename ):
os.utime(test,(time.time(),time.time()))
map(touch, find_xml_tests('path/to/files'))Context
StackExchange Code Review Q#40370, answer score: 4
Revisions (0)
No revisions yet.