рекурсивный список каталогов - PullRequest
2 голосов
/ 08 ноября 2010

У меня есть код ниже, который должен сделать рекурсивный список всех файлов и каталогов.Я не уверен, что он работает нормально.

#!/usr/bin/sh
recur_fun()
{
    for i in `ls -ltr | awk '{print $9}'` 
    do
        echo $i;
        cd $i;
        ls
        pwd
        recur_fun
        cd ..
        pwd
    done
} 

recur_fun

Мне нужно скопировать имя файла и затем использовать его в открытом регистре.

Ответы [ 4 ]

5 голосов
/ 08 ноября 2010

Я предлагаю заменить это на:

find . -print

2 голосов
/ 08 ноября 2010

Примечание. Я бы рекомендовал использовать команду cleartool, а не командную оболочку ОС.

Например:

cleartool ls -r -nxn

будет перечислять все файлы рекурсивно, приватно или нет.
См. Командная строка для удаления всех приватных файлов ClearCase для получения дополнительной информации.

2 голосов
/ 08 ноября 2010

ls уже имеет рекурсивную опцию:

ls -R
1 голос
/ 08 ноября 2010

Если цель состоит в том, чтобы выполнить работу, то используйте готовые инструменты, такие как 'find' или 'ls -R', чтобы выполнить работу надежно.

Если предположить, что целью является изучение рекурсии и сценариев оболочки, а не выполнение работы, то это не работает нормально по ряду причин:

  1. Он не будет обрабатывать имена с пробелами в них.
  2. Если что-то не является каталогом, cd в лучшем случае выдаст сообщение об ошибке.
  3. В худшем случае, если CDPATH установлен, а имя можно найти в CDPATH, тогда сценарий станет бесполезным.
  4. Поскольку вы не проверяете, работает ли cd, вы склонны видеть одни и те же файлы, перечисленные снова и снова, и снова и снова (один раз для каждого файла в данном каталоге).

Кроме того, две точки с запятой являются лишними.

Если вам нужно использовать cd в скрипте, обычно лучше сделать это в под-оболочке:

if [ -d $i ]
then ( cd $; pwd; recur_fun )
fi

Когда суб-оболочка завершает работу, вы знаете, что родитель все еще находится в том же месте, где он был раньше - это не зависит от капризов того, что команда cd делает с символьными ссылками. Современные оболочки (что означает bash), кажется, думают, что вы обычно должны хотеть 'логическую cd' операцию, которая чертовски раздражает меня, потому что я почти никогда не хочу такого поведения.

...