find

Chercher remplacer une chaine

Sur linux, ne vous est-il jamais arrivé de vouloir chercher une chaine de caractères dans un dossier complet, autrement dit une multitude de fichiers ? Et bien croyez-moi, si un jour vous devez chercher une adresse email, une adresse ip, un bout de code, ou autre, dans plusieurs milliers de fichiers, cette commande vous épargnera un gros travail manuel.

Placez vous dans le répertoire dans lequel vous souhaitez rechercher une chaine de caractères. Et tapez la commande suivante :

find . -name "*" -type f -exec grep -Hn "trouvemoi" {} \;

En remplaçant trouvemoi par ce que vous cherchez.

Par exemple, si vous cherchez une adresse IP dans tous vos fichiers logs à la fois, vous ferez (ne tapez que ce qui se trouve après le #) :

# cd /var/log
# find . -name "*" -exec grep -Hn "192.168.0.1" {} \;

Alternative

find . | xargs grep 'The Big Brains Company' -sl

Avec grep

grep -lR "2016-05-09-website-response-time" media/devel/ouestline-jekyll_posts/
media/devel/ouestline-jekyll_posts/2017-01-15-syntaxe-markdown.md
ou
cd media/devel/ouestline-jekyll_posts/
grep -lR "2016-05-09-website-response-time" *

Chercher une chaîne avec exclusion de répertoire

find .  -type d \( -name _site  \) -prune -o -name "*" -type f -exec grep -Hn "resources/font-awesome" {} \;

Chercher dans des fichiers libreoffice odt

Chercher dans les fichiers type .odt dont le contenu est compressé. pour ce faire on utilisera la ligne de commandes en combinant find grep et unzip, pour cela adaptez cette commande à votre cas :

find chemin/du/répertoire -name ‘*.odt’ -exec sh -c ‘unzip -c “{}” content.xml grep -qi “motàchercher”’ “;” -print

Pour ce qui est des fichiers .pdf, la recherche se fera aussi en ligne de commande de la même façon qu’avec grep mais en installant auparavant le paquet pdfgrep.

Remplacer une chaine

Si vous utilisez Linux, vous aurez forcément besoin un jour de remplacer une chaine de caractères dans plusieurs fichiers, sans pour autant devoir tout faire manuellement.

Imaginons, par exemple, que vous souhaitiez remplacer une adresse email dans tous les fichiers .php d’un répertoire et de ses sous-répertoires. Si l’adresse à remplacer est “georges@6ma.fr”, et que la nouvelle adresse est “michel@6ma.fr”, voici la commande :

find . -name "*.php" -type f -exec sed -i "s#georges@6ma.fr#michel@6ma.fr#g" {} \;

Remplacez .php par l’extension que vous voulez. Et si vous souhaitez le faire dans tous les fichiers (toutes extensions), vous pouvez également faire “

find . -name "*" -type f -exec sed -i "s#wlp2s0#wlan0#g" {} \;

Autre procédure

find . -name "*" -type f -print |xargs sed -i 's/enp1s0/eth0/g'

Exclure des répertoires

You can use the find command as follows to find all directories except tmp directory:

find /path/to/dest -type d \( ! -name tmp \) -print

Find all directories except tmp and cache:

find /path/to/dest -type d \( ! -name tmp \) -o \( ! -name cache \) -print

The -prune option make sure that you do not descend into directory:

find /path/to/dest -type d \( ! -name tmp \) -o \( ! -name cache -prune \) -print

You can find all *.pl find except in tmp and root directory, enter:

find /  \( ! -name tmp \) -o \( ! -name root -prune \)  -name "*.pl" -print

Supprimer des fichiers

Exemple : on veut supprimer tous les fichiers qui commence par “etrex” dans les répertoires et sous-répertoires du chemin courant.

find . -type f -name "etrex*" -exec rm -f {} \;

Supprimer texte entre 2 balises (balises comprises)

Exemple A : Supprimer les balises javascript et le contenu dans les fichiers html

:::bash
#!/bin/bash
# ALL HTML FILES
FILES="*.html"
# for loop read each file
for f in $FILES
do
INF="$f"
OUTF="$f.out.tmp"
# replace javascript
sed '/`<script type="text\/javascript"/,/<\/script>`/d' $INF > $OUTF
/bin/cp $OUTF $INF
/bin/rm -f $OUTF
done

Lister les fichiers récursivement par date de modification

trier les fichiers d’une arborescence récursivement, par ordre de date de modification.

find . -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r

Créer une playlist

find /media/yanplus/Musique/ -iname "*.mp3" > /media/yanplus/Musique/yannick.m3u

find by date and move files

:::bash
# example move files newer 11/01/2010 in "archives/" folder
#
touch --date "2010-01-11" /tmp/foo
# find and move
for file_erase in `find . -newer /tmp/foo`; do
   echo -n "Move $file_erase : "
   mv $file_erase 'archives/' 
   echo "Done"
done