Moyen portable pour répertorier tous les fichiers dans un répertoire sans parsingr ou trouver ls

J’essaie d’obtenir une liste de tous les fichiers dans un répertoire donné pour fournir une liste de noms de fichiers pour un simple Makefile dotfiles. L’idée est que la liste des noms de fichiers est placée dans une variable, puis une liste de fichiers “méta” tels que le Makefile lui-même est supprimée de la liste. Ensuite, les fichiers de la liste sont liés par un lien symbolique dans $ HOME.

Je ne veux pas parsingr ls ou find car je ne peux pas compter sur un programme aléatoire pour nommer son fichier de configuration sans espace. Et je ne peux pas non plus compter sur les programmes pour lancer leurs noms de fichiers “dotfiles” avec un “point”.

J’ai essayé la solution for-loop à parse ls ou find , qui utilise le * glob. Le problème est que les globes ne correspondent pas par défaut aux fichiers commençant par un point.

Il y a des options de globalisation dans chaque shell (bash, zsh, etc.) qui permettent à * glob de s’étendre pour inclure des fichiers .dotf, et même d’exclure. et .. mais ce n’est pas portable.

Aucune suggestion?

Faites-moi savoir si vous voyez un problème XY .

Faites le glob en deux étapes et taillez le . et .. entrées manuellement, ou avec un test pour “fichier régulier”. Bien sûr, le “echo” est juste pour tester. Ajoutez-le à votre liste pour un traitement non sortingvial.

Edit: Silly moi. Au lieu de boucler deux fois, la liste de tous les fichiers (avec et sans points) est juste * .* . En outre, la commande de test [ prend son argument sous forme de chaîne, nous devons donc le citer pour les espaces. Code révisé:

 # Process non-dotfiles and dotfiles. (Only the regular files) for f in * .*; do if [ -f "$f" ]; then echo $f fi; done 

Ou, utilisez find pour faire tout le travail en même temps, y compris le symlinking. Par exemple:

 find . -type f \( ! -iname Makefile \) -exec ln -s \{\} newdir/\{\} \; 

Ou, utilisez une combinaison des deux, en utilisant le modèle find -print0 comme suggéré dans votre lien source: cela va gérer les espaces et les nouvelles lignes correctement, en laissant votre script obtenir des noms de fichiers séparés par find -print0 .

Vous dites

Je ne veux pas parsingr ls ou find car je ne peux pas compter sur un programme aléatoire pour nommer son fichier de configuration sans espace.

Le problème des espaces blancs est la raison find laquelle find a l’option -print0 , pour imprimer ses résultats séparés par des caractères nuls (ASCII 0) qui ne peuvent pas apparaître dans les noms de fichiers.