2016-07-12 2 views
0

Dans mon script bash Je dois vérifier le contenu d'un dossier, mais son chemin peut être modifié avec un arbre différent « terminaisons »Imprimer le contenu d'un dossier avec un chemin variable BASH

mon dossier est d'abord:

/home/myuser/my_folder 

Ensuite, un utilisateur peut modifier le nom de mon dossier avec les terminaisons possibile d'arbres

/home/myuser/my_folder_aaaa 
/home/myuser/my_folder_bbbb 
/home/myuser/my_folder_cccc 

Ainsi, un utilisateur peut ajouter "_aaaa" ou "_bbbb" "_cccc"

Ces suffixes sont connus.

Dans mon script bash, comment puis-je vérifier avec "ls" le contenu de mon dossier au cas où quelqu'un changerait le nom? NB: Je dois vérifier que ce dossier, donc s'il y a un dossier appelé «/home/myuser/my_folder_ssss » ne doit pas correspondre et le contenu ne doit pas être affiché

Répondre

0

Il semble que vous avez besoin quelque chose comme ceci:

ls -1 | egrep "^my_folder(|_aaaa|_bbbb|_cccc)$" 

Cette commande affiche le nom du dossier spécifié s'il existe.

ls -1 Imprime tous les noms d'éléments dans le répertoire un par ligne.

egrep vérifie si le nom de l'élément correspond à my_folder ou my_folder_aaaa, my_folder_bbbb, my_folder_cccc.

Ensuite, vous pouvez faire ce que vous voulez avec ce nom. Par exemple, vous pouvez vérifier le contenu avec:

ls -l `ls -1 | egrep "^my_folder(|_aaaa|_bbbb|_cccc)$"` 
+0

comment puis-je récupérer le chemin complet actuel? Puisque je ne connais pas le changement effectué, comment puis-je "enregistrer" dans une variable le nouveau chemin complet (par exemple,/home/myuser/my_folder_bbbb)? J'ai essayé d'insérer la commande "pwd" mais rien .. – user3472065

+0

@ user3472065 S'il vous plaît, vérifiez cela: http: // superuser.com/questions/202645/comment-obtenir-le-chemin complet d'un fichier-dans-bash –

+0

S'il vous plaît voir: [Pourquoi vous ne devriez pas analyser la sortie de ls (1)] (http://mywiki.wooledge.org/ParsingLs) – andlrc

1

Si vous voulez afficher le contenu du dossier, et si la liste des suffixes connus ne sont pas trop longtemps, donner un essai à ceci:

ls -d /home/myuser/my_folder/* /home/myuser/my_folder/.* /home/myuser/my_folder_aaaa/* /home/myuser/my_folder_aaaa/.* /home/myuser/my_folder_bbbb/* /home/myuser/my_folder_bbbb/.* /home/myuser/my_folder_cccc/* /home/myuser/my_folder_cccc/.* 2>/dev/null 

-d: ne pas répertorier le contenu du répertoire.

2>/dev/null: rediriger l'erreur standard vers /dev/null; ls messages d'erreur sur les répertoires non existants ne seront pas affichés.

Notez que find est préféré dans les scripts.

+0

Vous pouvez également utiliser 'setopt -s nullglob' pour étendre les globs non correspondants à rien. – andlrc

2

Vous pouvez utiliser des prédicats d'expression régulière dans trouver et exécuter ls si les matchs regex:

find /home/myuser/ -regex ".*/my_folder\(_aaaa\|_bbbb\|_cccc\)$" -exec ls "{}" ";" 
+0

On pourrait aussi utiliser l'approche plus verbeuse qui est décrite dans POSIX find: 'find/home/monutilisateur/\ (-name 'mon_folder_aaaa' -o -name 'mon_folder_bbbb' ... \) -exec ...' – andlrc

0

Ce qui suit ls -l les dossiers qui correspondent au modèle dans votre description

ls /home/myuser/my_folder_* | grep "aaaa\|bbbb\|cccc" | while read x; do ls -l ${x:0:-1}; done 
+0

Please voir: [Pourquoi ne pas analyser la sortie de ls (1)] (http://mywiki.wooledge.org/ParsingLs) – andlrc

+1

Yup! l'analyse de la sortie 'ls' semble être une mauvaise idée. Je vous remercie. – ViKiG