Як пройти через кожен файл у папці?

У мене є папка під назвою exam. У цій папці є 3 папки під назвою математика, фізика та англійська мова. Всі ці папки мають деякі підпапки та файли в них. Я хочу пройти через кожну папку і роздрукувати шлях кожної папки та файлу в інший файл з назвою файлів. Я зробив це:

#!/bin/bash

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

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

Вихід, який я отримую:

/ будинок/школа/іспит/математика

/ будинок/школа/іспит/фізика

/ home/school/exam/english

Я не можу зрозуміти, як зробити код відвідування та робити те ж саме в підпапках іспиту. Будь-які пропозиції?

PS Я просто новачок у сценаріях оболонки.

1

5 Відповіді

find /home/school/exam -print > files
3
додано
Якщо я розумію ваше запитання, просто find exam-print> files з батьківським каталогом іспиту як робочий каталог. Використання ~/exam буде працювати тільки для людей, які мають каталог exam у їх домашньому каталозі.
додано Автор Michael Hoffman, джерело
це робить цю роботу. Але тепер, коли я думаю про це, я роблю цей сценарій як частину команди, і тому, що кожен в команді має інший шлях для папки іспиту, я не думаю, що він буде працювати. Як я можу змінити це? Я намагався знайти файли */exam -print>, але він не говорить такого файлу чи каталогу.
додано Автор captain, джерело
Гаразд, я змінив його у файли ~/exam-print>, і це працює. Але чи справді він буде працювати на інших комп'ютерах, у яких є папка для іспитів?
додано Автор captain, джерело
У них є каталог екзаменів. Я думаю, що це буде працювати. Я протестую, як тільки зможу. Дякую за відповіді.
додано Автор captain, джерело

За допомогою параметра globstar bash буде повторювати всі імена файлів у підкаталогах при використанні двох сусідніх зірок

використання:

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

Довідник тут 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.

і 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
додано

Як про це рекурсивно перелічити всі ваші файли.

for i in *; do ls -l $i ; done
1
додано

ви можете скористатися командою find , вона може отримати всі файли, тоді ви можете щось зробити на них, наприклад, за допомогою exec або xargs.

0
додано

Ви також можете використовувати команду tree , яка входить до більшості дистрибутивів * nix. (Незважаючи на те, що Ubuntu є винятком, але він може бути встановлений через apt-get)

LOC="/home/school/exam/"
tree -if $LOC > files
0
додано