Hoe doorloop ik elk bestand in een map?

Ik heb een map genaamd examen. Deze map heeft 3 mappen met de naam wiskunde, natuurkunde en Engels. Al deze mappen hebben een aantal submappen en bestanden daarin. Ik wil door elke map bladeren en het pad van elke map en bestand afdrukken op een ander bestand met de naam bestanden. Ik heb dit gedaan:

#!/bin/bash

LOC="/home/school/exam/*"

{
  for f in $LOC 
  do
   echo $f
  done
 } > "files"

De uitgang die ik krijg is:

/ Home/scholen/examen/math

/ Home/scholen/examen/natuurkunde

/ Home/scholen/examen/engels

Ik kan niet achterhalen hoe de code moet worden bezocht en doe hetzelfde met de submappen van het examen. Suggesties?

PS Ik ben slechts een beginner in shell scripting.

1

5 antwoord

find /home/school/exam -print > files
3
toegevoegd
Als ik uw vraag begrijp, zoek dan exam -print> bestanden op met de bovenliggende map van het onderzoek als de werkmap. Het gebruik van ~/examen werkt alleen voor mensen met een examen directory in hun homedirectory.
toegevoegd de auteur Michael Hoffman, de bron
dit is de klus. Maar nu ik erover nadenk, doe ik dit script als onderdeel van een team en omdat iedereen in het team een ​​ander pad heeft voor de examenmap, denk ik niet dat het zal werken. Hoe kan ik dit wijzigen? Ik heb geprobeerd om */examination -print> -bestanden te vinden, maar er staat geen dergelijk bestand of die map vermeld.
toegevoegd de auteur captain, de bron
Ok, ik heb het veranderd in find ~/examination -print> bestanden en het werkt. Maar gaat het zeker werken op andere computers met de examenmap?
toegevoegd de auteur captain, de bron
Ze hebben een examenmap. Ik denk dat het zal werken. Ik zal het zo snel mogelijk testen. Bedankt voor de antwoorden.
toegevoegd de auteur captain, de bron

Met de optie globstar zal bash alle bestandsnamen in subdirectories recurse ren wanneer twee aangrenzende sterren worden gebruikt

gebruik :

shopt -s globstar
for i in /home/school/exam/**

De referentie hier is man bash :

globstar
                      If set, the pattern ** used in a pathname expansion context
                      will match all files and zero or more directories and
                      subdirectories.  If the pattern is followed by a /, only
                      directories and subdirectories match.

en info bash :

          *      Matches any string, including the null string.  When  the
                 globstar  shell  option  is  enabled,  and * is used in a
                 pathname expansion context, two adjacent  *s  used  as  a
                 single  pattern  will  match  all  files and zero or more
                 directories and subdirectories.  If followed by a /,  two
                 adjacent  *s  will match only directories and subdirecto‐
                 ries.
2
toegevoegd

Hoe zit dit om al uw bestanden recursief op te sommen.

for i in *; do ls -l $i ; done
1
toegevoegd

je kunt find gebruiken, het zou alle bestanden kunnen krijgen, dan kun je er iets op doen, bijvoorbeeld met exec of xargs.

0
toegevoegd

U kunt ook de opdracht tree gebruiken die deel uitmaakt van de meeste * nix-distributies. (Hoewel Ubuntu een opmerkelijke uitzondering is - maar kan worden geïnstalleerd via apt-get)

LOC="/home/school/exam/"
tree -if $LOC > files
0
toegevoegd