Last Updated on 3 Ottobre 2021 by Roberto De Pedrini
Approfitto di una domanda fatta sui gruppi di discussione Midrange.com (Is there an easy way to find a file in IFS?) per riepilogare, in questo post, alcuni modi differenti per cercare un file all’interno di una o più directory IFS. La domanda specifica era … esiste qualcosa di per cercare negli oggetti IFS come comando WRKOBJ che utilizziamo in ambiente IBM i nella libreria QSYS?
Se “navighiamo” nel nostro IFS partendo da QSH, ricordiamoci che siamo in un mondo molto simile al Linux e quindi diversi comandi Linux funzionano egregiamente anche qui!
Supponiamo di avere una directory IFS “/f4docs” dove ci sono migliaia di file e sottocartelle. Vediamo diversi tipi di ricerca e le diverse possibilità che abbiamo da ambiente IBM i o da QSH:
1 – Comando FIND da QSH o SSH: vediamo in questo una ricerca di tutti i files della directory “/f4docs” di tipo “.TXT” con il nome che contiene “02342” … comprese eventuali sottodirectory
find /f4docs -name "*02432*.TXT"
2 – Comando FIND + GREP da QSH o SSH : il problema del FIND è che è sempre case-sensitive in ambiente QSH … se abbiamo bisogno di filtrare solo determinati file non tenendo conto del “case” carattere:
find /f4docs -type f -name "*02432*" | grep ".txt" -i
3 – Comando FIND + GREP (per cercare anche dentro nel contenuto dei files), da QH e SSH: modificando leggermente la sintassi della parte GREP è possibile anche cercare i files con un certo contenuto (in questo caso la stringa “MOTO”
find /f4docs -name "*.TXT" -exec grep -l 'MOTO' {} \;
4 – Con SQL e QSYS2.IFS_OBJECT_STATISTICS: una alternativa interessante per cercare files e oggetti IFS è SQL con gli IBM i Services … in particolare QSYS2.IFS_OBJECT_STATISTICS
Select *
from Table(QSYS2.IFS_Object_Statistics(Start_Path_Name => '/f4docs',
Subtree_Directories => 'YES')) x
Where Lower(Path_Name) like '%02432%';
5 – Con RTVDIRINF e SQL sulle tabelle cataloghi create:
// first, delete RTVDIRINF result tables
DLTF QSURSYS/QAEZD0001I
MONMSG MSGID(CPF0000)
DLTF QSURSYS/QAEZD0001D
MONMSG MSGID(CPF0000)
DLTF QSURSYS/QAEZD0001O
MONMSG MSGID(CPF0000)
// then collect data from your directoy
RTVDIRINF DIR('/f4docs')
// and search your files
SELECT o.Qezalcsize
,SUBSTR(o.Qezobjnam, 1, 40)
,d.Qezdirnam1
FROM qusrsys.Qaezd0001o o
INNER JOIN qusrsys.Qaezd0001d d
ON o.Qezdiridx = d.Qezdiridx
WHERE 1=1
and qezobjtype='*STMF'
and UPPER(o.Qezobjnam) LIKE '%02432%'
ORDER BY o.Qezalcsize DESC;
6 – Con Powershell e Findstr se la directory IFS è in condivisione – share: se vogliamo cercare dentro il contenuto dei files da Windows, possiamo utilizzare la PowerShell e il comando Findstr, puntanto ad una directory IFS condivisa … con una velocità veramente interessante. Se vogliamo, ad esempio, cercare i files che contengono al loro interno la parola “MOTO” …. come nell’esempio 3 sopra riportato, ma utilizzando FINDSR la sintassi è la seguente:
findstr /s /i /c:"MOTO" \\myIBMi\f4docs\*.TXT
/s search in al subdirectories
/i case insensitive
/c: search string
7 – Updatedb e Locate, utility open source dal mondo Linux … permettono una ricerca veloce utilizzando anche tutte le potenzialità delle regular expression.
updatedb -l0 -U /f4docs -o /tmp/myindex
locate -d /tmp/myindex 02342
Index
Altri esempi
01 Cercare i files che iniziano con un numero
Listare i files in una directory IFS che non iniziano con un numero (“myfile.txt” ok, “210021.txt” not ok)
ls | grep -v '^[0-9]'
02 Cercare le directory vuote
Il comando “find” … che arriva con QShell, è molto limitato.
Ti consiglio di installare la versione GNU “findutils” per avere un find molto più potente.
-- Once only
yum install findutils
-- then, if you are looking for empty directories
find /home/faq400/ -type d -empty
---
Roberto De Pedrini
Faq400.com