web-dev-qa-db-fra.com

Comment trouver tous les liens soft (liens symboliques) dans le répertoire actuel?

La question concerne les scripts shell dans bash.

Comment vérifier avec un script quels fichiers dans le répertoire actuel sont des liens mous?

Au cas où j'avais utilisé le mauvais terme, lorsque je dis liens soft , je parle de fichiers créés à l'aide de ln -s.

La seule chose que j'ai réussi à penser est d'évaluer ls -la comme une expression, et analyser ses résultats, mais évidemment, ce n'est pas la meilleure solution.

10
bguiz

Voir - 'Expressions conditionnelles' dans man bash - Dans ce cas, vous voulez -h:

for file in *
do
  if [ -h "$file" ]; then
    echo "$file"
  fi
done
14
Polsy

Vous n'avez peut-être pas vraiment besoin d'un script. Pour afficher les liens symboliques dans le dossier actuel, sans recouvrer dans un dossier enfant:

trouve . -MaxDepth 1 -Type L -Print

Ou, pour obtenir d'autres informations, utilisez l'une des:

trouve . -MaxDepth 1 -Type L -exec ls -ld {} + 
 trouver. -MaxDepth 1 -Type L -Print0 | xargs -0 ls -ld

Pour dire si Un fichier est un lien symbolique, on peut utiliser readlink, ce qui ne produira rien si ce n'est pas un lien symbolique. L'exemple suivant n'est pas très utile, mais montre comment readlink ignore les fichiers et les dossiers normaux. Utilisez l'un des:

trouve . -MaxDepth 1 -exec Readlink {} + 
 trouver. -MaxDepth 1 -print0 | Xargs -0 Readlink

Notez que ce qui précède -exec ... + et xargs ... sont beaucoup plus rapides que -exec ... \;. Comme:

temps Trouver/usr/bin -maxdepth 1 -Type L -exec ls -ld {} \; 
 réel 0m0.372s [.____] utilisateur 0m0.087s [.] SYS 0M0.163S 
 
 TEMPS TROUVER/USR/BIN -MAXDEPTH 1 -TYPE L -XEC LS -LD {} + [ ] SYS 0M0.008S 
 
 Temps Trouver/USR/BIN -MAXDEPTH 1 -TYPE L -PRINT0 | xargs -0 ls -ld [.____] réel 0m0.012s [.____] User 0m0.004S 
 SYS 0M0.009S
14
Arjan