2016-10-26 3 views
2

Je rencontre des problèmes pour échapper les crochets dans n'importe quel nom de fichier.Comment faire pour échapper les crochets dans une sortie ls

J'ai besoin de comparer deux listes. La sortie ls est la première liste et la seconde est l'ARQ02.

#!/bin/bash 

exec 3< <(ls /home/lint) 

while read arq <&3; do 
var=`grep -e "$arq" ARQ02` 
    if [ "$?" -ne 0 ] ; then 
    echo "$arq" >> result 
    fi 
done 

exec 3<&- 

Désolé pour mon mauvais anglais.

+1

qu'est-ce que 'ARQ02'? il me semble un fichier. alors dites-vous juste pour voir si vos fichiers dans certains dossiers se trouvent être un sous-ensemble des fichiers répertoriés dans un autre fichier? il y a déjà un certain nombre d'erreurs courantes que vous commettez dans un script aussi court. – HuStmpHrrr

Répondre

2

Votre problème immédiat est que vous devez demander grep d'interpréter le terme de recherche comme littérale plutôt qu'une expression régulière, en utilisant l'-F l'option:

var=$(grep -Fe "$arq" ARQ02) 

De cette façon, tout regex les méta-caractères qui se trouvent dans la sortie de ls /home/lint - tels que [ et ] - seront toujours traités comme littéraux et ne casseront pas le grep invocation.

Cela dit, il semble que votre commande pourrait être rationalisé, comme par en utilisant la sortie de ls /home/lintdirectement comme l'ensemble des chaînes de recherche pour passer à grepà la fois, en utilisant la -f Option:

grep -Ff <(ls /home/lint) ARQ02 > result 

<(...) est un soi-disant process substitution, qui, tout simplement, présente e e sortie d'une commande comme s'il s'agissait d'un fichier (temporaire) , qui est ce que -f attend: un fichier contenant les termes de recherche pour grep.


En variante, si:

  • les lignes de ARQ02 contiennent seulement noms de fichiers qui entièrement partie (une partie des) les noms de fichiers dans la sortie de ls /home/lint et

  • cela ne vous dérange pas tri ou voulez trier les matchs stockés dans result,

considérez HuStmpHrrr's helpful answer.

2

Je dois supposer que mon interprétation est correcte. basé sur cela, je peux soulever un oneliner facilement résoudre votre solution. il y a 2 hypothèse que je dois faire ici: votre nom de fichier ne contient pas de retour chariot et que vous utilisez bash moderne:

comm -23 <(printf "%s\n" * | sort) <(sort ARQ02) 

en bash <() émet un sous-shell et le tuyau stdout sous forme de fichier. comm est la commande pour calculer la différence de 2 flux d'entrée.

pour expliquer dans les détails,

comm 
-23 # suppress files unique in ARQ02 and files in common 
<(printf "%s\n" * | # print all the files in local folder with new line breaker 
    sort) # sort them 
<(sort ARQ02) 

il est nécessaire de trier comme comm seulement comparer progressivement.