Nota: los archivos de texto deben ser codificados con el "UTF8" de la codificación.
He aquí una secuencia de comandos inicial:
Ejemplo: Las palabras clave:
"Bill
Bob
Joe"
fgrep y ordenar las líneas de retorno, como este :
/path/of/thisFile.txt:Bill
/path/of/thisFile.txt:Bob
/path/of/thisFile.txt:Joe
/path/of/thisFile2.txt:Bob
/path/of/thisFile2.txt:Joe
/path/of/thisFile3.txt:Bob
/path/subf1/of/some_File.txt:Bill
/path/subf3/of/some_xzzz_File.txt:Bill
La secuencia de comandos utiliza un bucle para comprobar la ruta de acceso de cada elemento de esta lista.
La secuencia de comandos de obtener la ruta de acceso desde el primer punto, se retire ":proyecto de Ley" al final de la línea --> por lo que la ruta es "/path/of/thisFile.txt".
La secuencia de comandos de verificación en el elemento (índice actual + el número de palabras clave -1), es el tercer elemento, por lo que el tercer elemento contiene el mismo camino, entonces la secuencia de comandos anexar el camino a una nueva lista de
Los demás elementos no contiene todas las palabras clave.
set r to text returned of (display dialog "What keywords?" default answer "Joe Bill Bob") --- each keyword must be sepearated by a space
set tKeys to my makeKeysForGrep(r)
if tKeys is not "" then
set masterFolder to choose folder with prompt "Select the source folder .."
set filesList to my getFilescontainingKeywords(masterFolder, tKeys) -- get a list of files ( each file contains all the keywords)
--do something with the filesList -- this list contains path of type 'posix path'
end if
on makeKeysForGrep(t)
(*** delete trailing and leading spaces, replace multiple spaces in a row by one space (clean the string to avoid issue with the unnecessary spaces in the grep command),
and replace the space character by a linefeed character , so each line contains a keyword. ***)
set r to do shell script "perl -pe 's/ +$|^ +//g; s/ +/ /g; s/ /\\n/g; ' <<< " & (quoted form of t) & "| sort -u" without altering line endings
if r is not linefeed then return text 1 thru -2 of r -- remove the last line (it's a blank line)
return "" -- r is a a blank line, so return ""
end makeKeysForGrep
on getFilescontainingKeywords(dir, tKeys)
script o
property tfiles : {}
end script
set numOfKeywords to count (paragraphs of tKeys) -- get the number of keywords
set tFolder to quoted form of POSIX path of dir
set o's tfiles to do shell script "fgrep -R -o -w --include \"*.txt\" " & (quoted form of tKeys) & " " & tFolder & " | sort -u"
-- fgrep return the full path + ":" + the keyword, sort -u : sort the paths and deletes duplicate lines (because the same file can contains multiple occcurences of a keyword)
if o's tfiles is not "" then
if numOfKeywords = 1 then return o's tfiles -- no need to continue because one keyword only, return all Files
set l to {}
set o's tfiles to paragraphs of o's tfiles
set tc to count o's tfiles
set firstKeyword to ":" & (paragraph 1 of tKeys)
set numCh to (length of firstKeyword) + 1
set i to 1
repeat while (i < tc) -- check each path in the list, the same path must exists numOfKeywords in a row
set thisItem to (item i of o's tfiles)
if thisItem ends with firstKeyword then
set textFilepath to text 1 thru -numCh of thisItem
set j to (i + numOfKeywords - 1)
if j > tc then exit repeat
if (item j of o's tfiles) starts with textFilepath then -- this file contains all the keywords
set end of l to textFilepath --- append this path to the list
set i to i + numOfKeywords -- to skip items wich contains the same path
else
set i to i + 1 -- next file
end if
else
set i to i + 1 -- next file
end if
end repeat
return l -- list of files which contains all the keywords
end if
return {} -- No files found
end getFilescontainingKeywords
Las opciones de fgrep
:
-
El --include \"*.txt\"
opción : sólo los archivos que coincidan con el dado
patrón de nombre de archivo en las que se busca, por lo que cualquier nombre que terminan con ".txt"
El -w
opción : concordancia de palabra solamente, así que Bob no coincide con Bobby,
eliminar esta opción si desea encontrar una subcadena en el texto.
El -R
opción : buscar de forma recursiva subdirectorios, quitar esta
opción si no desea que la recursividad.
Añadir el -i
opción para realizar la coincidencia de mayúsculas y minúsculas. Por
por defecto, fgrep
es sensible a mayúsculas y minúsculas.