10
votes

En Bash, l'opérateur de fichiers peut-il être insensible à la casse?

Je fais ce qui suit: xxx pré>

mais je veux que le -f code> soit insensible à la casse. C'est-à-dire que si le fichier est / etc / oonefile code>, je veux -f -f à reconnaître / etc / oonefile code>. P>

Je peux travailler partiellement autour de celui-ci avec GLOB: P>

shopt -s nocaseglob
TARG='/etc/somefile'

MATCH=$TARG*    #assume it returns only one match

if [[ -f $MATCH ]] ; then
    echo "File exists" 
fi


1 commentaires

Jetez un coup d'œil à Stackoverflow.com/a/12953235/848072 pour une analyse approfondie de l'insensibilité Trouver


6 Réponses :


1
votes

Ne sachant pas comment utiliser uniquement des évaluations de shell. Mais le GREP peut être insensible à une casse, donc un script qui invoque le grep, la recherche et le WC peut répondre à votre demande.


0 commentaires

1
votes

Vous pouvez utiliser l'option NOCASMATCH

shopt -s nocasematch
for file in *
do
  case "$file" in
   "/etc/passWd" ) echo $file;;
  esac
done 


1 commentaires

Je ne pense pas que cela fonctionne depuis que le GLOB ne retourne pas des chemins absolus.



12
votes

Le problème est que votre système de fichiers em> est sensible à la casse. Le système de fichiers ne fournit que deux manières pertinentes d'obtenir un fichier: soit vous spécifiez un nom de fichier précon, sensible à la casse et vérifiez son existence de cette façon, ou de lire tous les fichiers d'un répertoire, puis de vérifier si chacun correspond à un motif. En d'autres termes, il est très inefficace de vérifier si une version insensible à une casse d'un fichier existe sur un système de fichiers sensible à la casse. La coquille pourrait le faire pour vous, mais en interne, il lisait tout le contenu du répertoire et en vérifiant chacun un contre un motif. P>

donné tout cela, cela fonctionne: P>

if [[ -n $(find /etc -maxdepth 1 -iname passwd) ]]; then
  echo "Found";
fi


3 commentaires

Trouver / -Involename Travaillera probablement aussi, mais serait grossièrement inefficace.


@Philipp: Ouais, comme je l'ai dit: "Sauf si vous voulez tout chercher de" / "en bas" ... et si vous avez des symboles circulaires, priez ...


Quelqu'un devrait probablement dire cela à Debian (PKG / Debian: OK; PKG / Debian: C'est bon d'aller!; PKG / Debian: Pourquoi pas ?!)



1
votes

Ceci est très difficile à faire, en général, si le système de fichiers est sensible à la casse. Fondamentalement, vous avez une incidence sur chacun des répertoires d'ancêtre séparément. Voici un point de départ dans python : xxx


0 commentaires

0
votes
cd /etc
# using FreeBSD find
find -x -L "$(pwd)" -maxdepth 1 -type f -iregex "/EtC/[^\/]*" -iname paSSwd 

0 commentaires

0
votes

Et voici un point de départ à l'aide de bash: xxx


0 commentaires