J'ai un dossier nommé «échantillon» et il contient 3 fichiers. Je veux écrire un script shell qui lira ces fichiers dans le dossier d'exemples et le publiera sur un site HTTP en utilisant curl.
J'ai écrit ce qui suit pour répertorier les fichiers dans le dossier:
for dir in sample/*; do
echo $dir;
done
Mais cela me donne la sortie suivante:
sample/log
sample/clk
sample/demo
Il y joint le dossier parent. Je veux la sortie comme suit (sans le nom du dossier parent)
log
clk
demo
Comment puis-je faire cela?
echo ${dir##*/}
pour décoller le chemin.Réponses:
Utilisez
basename
pour supprimer le premier chemin des fichiers:Mais pourquoi pas:
la source
En supposant que votre shell le supporte, vous pouvez utiliser l'expansion des paramètres
ou vous pouvez simplement passer à ce répertoire et y faire la liste
la source
--
n'est pas nécessaire ici. Le premier argument est une chaîne fixe sans tirets.${parameter##pattern}
est également pris en charge par tous les shells POSIX.Étant donné que les systèmes * nix permettent à presque tous les caractères de faire partie d'un nom de fichier (y compris les espaces, les sauts de ligne, les virgules, les symboles de canal, etc.), vous ne devez jamais analyser la sortie de la commande "ls" dans un script shell. Ce n'est pas fiable. Voir Pourquoi vous ne devriez pas analyser la sortie de ls .
Utilisez "rechercher" pour créer une liste de fichiers. Si vous utilisez Bash, vous pouvez insérer la sortie de "find" dans un tableau. Exemple ci-dessous, avec la mise en garde que j'ai utilisé une commande "curl" qui ne fonctionne pas!
la source
Cela dépend de ce que vous voulez faire avec les répertoires.
Pour simplement imprimer le nom, sans vérifier s'il s'agit d'un répertoire, vous pouvez utiliser ls:
Mieux vaut trouver, car vous pouvez utiliser des filtres:
Si vous souhaitez exécuter des commandes sur les fichiers, vous devez utiliser find et non une boucle for:
la source