Réponses:
*/
est un modèle qui correspond à tous les sous-répertoires du répertoire en cours ( *
correspondrait à tous les fichiers et sous - répertoires; le /
restreint aux répertoires). De même, pour répertorier tous les sous-répertoires sous / home / alice / Documents, utilisezls -d /home/alice/Documents/*/
*/
cela ne correspondra à aucun dossier caché. Pour les inclure, spécifiez-les explicitement comme ls -d .*/ */
ou définissez l' dotglob
option dans Bash.
ls
sur quelque chose qui n'existe pas.
ls */
se développerait juste ls
, ce qui répertorierait tous les fichiers dans le répertoire en cours. Je suis sûr que ce n'est pas ce que vous voulez dans ce cas.
echo
Exemple: echo */
, echo */*/
Voici ce que je suis:
cs/ draft/ files/ hacks/ masters/ static/
cs/code/ files/images/ static/images/ static/stylesheets/
ls
uniquementExemple: ls -d */
voici exactement ce que j'ai obtenu:
cs/ files/ masters/
draft/ hacks/ static/
Ou sous forme de liste (avec des informations détaillées): ls -dl */
ls
etgrep
Exemple: ls -l | grep "^d"
voici ce que j'ai obtenu:
drwxr-xr-x 24 h staff 816 Jun 8 10:55 cs
drwxr-xr-x 6 h staff 204 Jun 8 10:55 draft
drwxr-xr-x 9 h staff 306 Jun 8 10:55 files
drwxr-xr-x 2 h staff 68 Jun 9 13:19 hacks
drwxr-xr-x 6 h staff 204 Jun 8 10:55 masters
drwxr-xr-x 4 h staff 136 Jun 8 10:55 static
Exemple: for i in $(ls -d */); do echo ${i%%/}; done
voici ce que j'ai obtenu:
cs
draft
files
hacks
masters
static
Si vous aimez avoir '/' comme caractère de fin, la commande sera: for i in $(ls -d */); do echo ${i}; done
cs/
draft/
files/
hacks/
masters/
static/
3
était sensiblement plus lent que les autres pour moi. Dans le répertoire que j'ai testé: 1
.012s, 2
.016s, 3
.055s , 4
.021s.
1
est mon préféré.
time
la fonction Unix. /// Je suis d'accord, echo */
c'est plus intelligent que ls -d */
.
1.
option causera des douleurs importantes lors du traitement des noms de dossiers qui ont des espaces.
J'utilise:
ls -d */ | cut -f1 -d'/'
Cela crée une seule colonne sans barre oblique de fin - utile dans les scripts.
Mes deux centimes.
-1
option pour ls
sera également affichée au format à colonne unique ls -1 -d */
.
-1
toujours une barre oblique de fin pour chaque entrée.
.bashrc
alias, comment puis-je l'ajouter '/'
?
'\/'
| sed -e 's-/$--'
Pour tous les dossiers sans sous-dossiers:
find /home/alice/Documents -maxdepth 1 -type d
Pour tous les dossiers avec sous-dossiers:
find /home/alice/Documents -type d
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
sinon vous vous incluez /home/alice/Documents
. Pour inclure des liens symboliques vers des répertoires, -L
Un astérisque sans guillemets*
sera interprété comme un motif (glob) par le shell.
Le shell l'utilisera dans l'extension du nom de chemin.
Il générera ensuite une liste de noms de fichiers correspondant au modèle.
Un simple astérisque correspondra à tous les noms de fichiers dans le PWD (répertoire de travail actuel).
Un modèle plus complexe */
qui correspondra à tous les noms de fichiers se terminant par /
.
Ainsi, tous les répertoires. C'est pourquoi la commande:
echo */
echo ./*/ ### avoid misinterpreting filenames like "-e dir"
sera étendu (par le shell) à echo
tous les répertoires du PWD.
Pour tester cela: créez un répertoire ( mkdir
) nommé comme test-dir, et cd
dans celui-ci:
mkdir test-dir; cd test-dir
Créez des répertoires:
mkdir {cs,files,masters,draft,static} # safe directories.
mkdir {*,-,--,-v\ var,-h,-n,dir\ with\ spaces} # some a bit less secure.
touch -- 'file with spaces' '-a' '-l' 'filename' # and some files:
La commande echo ./*/
restera fiable même avec des fichiers nommés étranges:
./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/
./masters/ ./-n/ ./static/ ./-v var/
Mais les espaces dans les noms de fichiers rendent la lecture un peu déroutante.
Si au lieu de echo
, nous utilisons ls
, le shell est toujours ce qui élargit la liste des noms de fichiers. Le shell est la raison pour obtenir une liste de répertoires dans le PWD. L' -d
option permettant de ls
répertorier l'entrée de répertoire actuelle au lieu du contenu de chaque répertoire (comme présenté par défaut).
ls -d */
Cependant, cette commande est (quelque peu) moins fiable. Il échouera avec les fichiers nommés étranges répertoriés ci-dessus. Il s'étouffera avec plusieurs noms. Vous devez effacer un par un jusqu'à ce que vous trouviez ceux qui ont des problèmes.
Le GNU ls
acceptera la --
touche "fin des options" ( ).
ls -d ./*/ ### more reliable BSD ls
ls -d -- */ ### more reliable GNU ls
Pour répertorier chaque répertoire dans sa propre ligne (dans une colonne, similaire à ls -1), utilisez:
$ printf "%s\n" */ ### Correct even with "-", spaces or newlines.
Et, encore mieux, nous pourrions supprimer la fin /
:
$ set -- */; printf "%s\n" "${@%/}" ### Correct with spaces and newlines.
Une tentative comme celle-ci:
$ for i in $(ls -d */); do echo ${i%%/}; done
Échouera le:
ls -d */
) comme déjà indiqué ci-dessus.IFS
.IFS
).Enfin, l'utilisation de la liste d'arguments à l'intérieur d'une fonction n'affectera pas la liste d'arguments du shell en cours d'exécution. Simplement:
$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs
présente cette liste:
--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var
Ces options sont sûres avec plusieurs types de noms de fichiers impairs.
La tree
commande est également assez utile ici. Par défaut, il affichera tous les fichiers et répertoires à une profondeur complète, avec quelques caractères ascii montrant l'arborescence des répertoires.
$ tree
.
├── config.dat
├── data
│ ├── data1.bin
│ ├── data2.inf
│ └── sql
| │ └── data3.sql
├── images
│ ├── background.jpg
│ ├── icon.gif
│ └── logo.jpg
├── program.exe
└── readme.txt
Mais si nous voulions obtenir uniquement les répertoires, sans l'arborescence ascii, et avec le chemin complet du répertoire actuel, vous pourriez faire:
$ tree -dfi
.
./data
./data/sql
./images
Les arguments étant:
-d List directories only.
-f Prints the full path prefix for each file.
-i Makes tree not print the indentation lines, useful when used in conjunction with the -f option.
Et si vous voulez ensuite le chemin absolu, vous pouvez commencer par spécifier le chemin complet vers le répertoire courant:
$ tree -dfi "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images
Et pour limiter le nombre de sous-répertoires, vous pouvez définir le niveau maximum de sous-répertoires avec -L level
, par exemple:
$ tree -dfi -L 1 "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/images
Plus d'arguments peuvent être vus avec man tree
Au cas où vous vous demandez pourquoi la sortie de 'ls -d * /' vous donne deux barres obliques de fin, comme:
[prompt]$ ls -d */
app// cgi-bin// lib// pub//
c'est probablement parce que quelque part votre fichier de configuration shell ou session alias la commande ls vers une version de ls qui inclut l'indicateur -F. Cet indicateur ajoute un caractère à chaque nom de sortie (ce n'est pas un fichier ordinaire) indiquant le genre de chose. Ainsi, une barre oblique est celle correspondant au modèle '* /', et l'autre barre oblique est l'indicateur de type ajouté.
Pour vous débarrasser de ce problème, vous pouvez bien sûr définir un alias différent pour ls. Cependant, pour ne pas invoquer temporairement l'alias, vous pouvez ajouter la barre oblique inverse à la commande:
\ ls -d * /
Je viens de l'ajouter à mon .bashrc
fichier (vous pouvez également le taper sur la ligne de commande si vous en avez besoin / ne le souhaitez que pour une session)
alias lsd='ls -ld */'
alors lsd produira le résultat souhaité.
ls
Solution réelle , y compris les liens symboliques vers les répertoiresDe nombreuses réponses ici n'utilisent pas réellement ls
(ou ne l'utilisent que dans le sens trivial de ls -d
, tout en utilisant des caractères génériques pour la correspondance réelle du sous-répertoire. Une vraie ls
solution est utile, car elle permet l'utilisation d' ls
options pour l'ordre de tri, etc.
Une solution utilisant ls
a été donnée, mais elle fait quelque chose de différent des autres solutions en ce qu'elle exclut les liens symboliques vers les répertoires:
ls -l | grep '^d'
(éventuellement passe à travers sed
ouawk
pour isoler les noms de fichiers)
Dans le cas (probablement plus courant) où des liens symboliques vers des répertoires devraient être inclus, nous pouvons utiliser l' -p
option de ls
, ce qui fait qu'il ajoute un caractère barre oblique aux noms des répertoires (y compris les liens symboliques):
ls -1p | grep '/$'
ou, en supprimant les barres obliques de fin:
ls -1p | grep '/$' | sed 's/\/$//'
Nous pouvons ajouter des options au ls
besoin (si une longue liste est utilisée, la -1
n'est plus requise).
Remarque: si nous voulons des barres obliques de fin, mais que nous ne voulons pas qu'elles soient mises en évidence par grep
, nous pouvons supprimer de manière piratée la mise en surbrillance en rendant la partie correspondante de la ligne vide:
ls -1p | grep -P '(?=/$)'
S'il n'est pas nécessaire que le répertoire caché soit répertorié, je propose:
ls -l | grep "^d" | awk -F" " '{print $9}'
Et si des répertoires cachés doivent être répertoriés, utilisez:
ls -Al | grep "^d" | awk -F" " '{print $9}'
OU
find -maxdepth 1 -type d | awk -F"./" '{print $2}'
awk
, consultez cette réponse
pour afficher les listes de dossiers sans /
ls -d */|sed 's|[/]||g'
ls -d1 */ | tr -d "/"
Voici ce que j'utilise
ls -d1 /Directory/Path/*;
ls -d1 /Directory/Path/*/
Pour répertorier uniquement les répertoires :
ls -l | grep ^d
pour répertorier uniquement les fichiers :
ls -l | grep -v ^d
ou vous pouvez aussi faire comme: ls -ld * /
Testez si l'élément est un répertoire avec test -d
:
for i in $(ls); do test -d $i && echo $i ; done
*/
est un modèle de correspondance de nom de fichier qui correspond aux répertoires du répertoire actuel.
Pour ne lister que les répertoires, j'aime cette fonction:
# long list only directories
llod () {
ls -l --color=always "$@" | grep --color=never '^d'
}
Mettez-le dans votre .bashrc.
Exemples d'utilisation:
llod # long listing of all directories in current directory
llod -tr # same but in chronological order oldest first
llod -d a* # limit to directories beginning with letter 'a'
llod -d .* # limit to hidden directories
REMARQUE: il se cassera si vous utilisez l' -i
option. Voici un correctif pour cela:
# long list only directories
llod () {
ls -l --color=always "$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}
Pour info, si vous souhaitez imprimer tous les fichiers sur plusieurs lignes, vous pouvez faire un ls -1
qui imprimera chaque fichier sur une ligne distincte. fichier1 fichier2 fichier3
J'ai résolu partiellement avec:
cd "/path/to/pricipal/folder"
for i in $(ls -d .*/); do sudo ln -s "$PWD"/${i%%/} /home/inukaze/${i%%/}; done
ln: «/home/inukaze/./.»: can't overwrite a directory
ln: «/home/inukaze/../..»: can't overwrite a directory
ln: accesing to «/home/inukaze/.config»: too much symbolics links levels
ln: accesing to «/home/inukaze/.disruptive»: too much symbolics links levels
ln: accesing to «/home/inukaze/innovations»: too much symbolics links levels
ln: accesing to «/home/inukaze/sarl»: too much symbolics links levels
ln: accesing to «/home/inukaze/.e_old»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gnome2_private»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gvfs»: too much symbolics links levels
ln: accesing to «/home/inukaze/.kde»: too much symbolics links levels
ln: accesing to «/home/inukaze/.local»: too much symbolics links levels
ln: accesing to «/home/inukaze/.xVideoServiceThief»: too much symbolics links levels
Eh bien, cela me réduit, la partie maire :)
Ajouter pour faire le tour complet, pour récupérer le chemin de chaque dossier, utilisez une combinaison de la réponse d'Albert ainsi que de Gordans qui devrait être assez utile.
for i in $(ls -d /pathto/parent/folder/*/); do echo ${i%%/}; done
Production:
/pathto/parent/folder/childfolder1/
/pathto/parent/folder/childfolder2/
/pathto/parent/folder/childfolder3/
/pathto/parent/folder/childfolder4/
/pathto/parent/folder/childfolder5/
/pathto/parent/folder/childfolder6/
/pathto/parent/folder/childfolder7/
/pathto/parent/folder/childfolder8/
Utilisation de Perl:
ls | perl -nle 'print if -d;'
Voici ce que j'utilise pour répertorier uniquement les noms de répertoire:
ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"
Pour répondre à la question d'origine, cela */
n'a rien à voir avec en ls
soi; cela se fait par le shell / Bash, dans un processus appelé globbing .
C'est pourquoi echo */
et ls -d */
sortir les mêmes éléments. (L' -d
indicateur fait ls
sortir les noms de répertoires et non le contenu des répertoires.)
Voici une variante utilisant l'arborescence qui ne sort les noms de répertoire que sur des lignes séparées, oui c'est moche mais bon, ça marche.
tree -d | grep -E '^[├|└]' | cut -d ' ' -f2
ou avec awk
tree -d | grep -E '^[├|└]' | awk '{print $2}'
C'est probablement mieux cependant et conservera le /
nom du répertoire après.
ls -l | grep "^d" | awk '{print $9}'
file *|grep directory
O / P (Sur ma machine) -
[root@rhel6 ~]# file *|grep directory
mongo-example-master: directory
nostarch: directory
scriptzz: directory
splunk: directory
testdir: directory
La sortie ci-dessus peut être affinée davantage en utilisant la découpe.
file *|grep directory|cut -d':' -f1
mongo-example-master
nostarch
scriptzz
splunk
testdir
* could be replaced with any path that's permitted
file - determine file type
grep - searches for string named directory
-d - to specify a field delimiter
-f1 - denotes field 1
La commande la plus courte jamais (en fait un hack) pour lister uniquement les répertoires. Tapez le chemin absolu ou le chemin relatif du répertoire d'intérêt et appuyez sur Entrée pour entrer dans le répertoire d'intérêt. Maintenant, tapez cd
et appuyez sur la touche de tabulation . Seuls les répertoires sont affichés maintenant.
user@ubuntu:~/Desktop$cd <tab key>
La commande ci-dessus ne devrait désormais afficher que les dossiers du bureau . Le plus court en effet.
-d
signifie réellement.