Используя 'ls' рекурсивно без-R

Можно переименовать папку IMAP в дураке, в то время как Вы изменяете папку, и Вы находитесь в списке папок:

'c?'

(папка изменения, затем используйте список папок).

Когда Вы находитесь на папке, которая имеет к переименованному, использовать 'r' ключ и Вас попросят нового названия папки.

0
12.11.2013, 04:11
2 ответа

Это кажется, что Вас просят записать рекурсивный сценарий самих вместо того, чтобы полагаться на команду, которая делает рекурсию для Вас.

Вот скелет такой функции. Я оставил часть пробела частей, чтобы Вы заполнили.

listAllFiles() {
    local dir=$1
    local file

    for file in "$dir"/*; do
        if <$file is a directory>; then
            listAllFiles "$file"
        else
            <print $file>
        fi
    done
}

На высоком уровне эта функция берет каталог в качестве своего первого аргумента. Это циклично выполняется по содержанию того каталога. Если это находит подкаталог, это называет себя. Иначе это печатает то, что это нашло. Это закончит тем, что рекурсивно вызвало через структуру каталогов.

Можно использовать эту функцию тем же путем, Вы использовали бы встроенную команду как ls -R или find. Вы могли сохранить результаты в переменной:

allFilesInCurrentDirectory=$(listAllFiles .)

Или Вы могли использовать его в конвейере:

listAllFiles ~/ | cmd1 | cmd2
1
28.01.2020, 02:52

Вы не указывали удар явно, таким образом, я беру свободу предложить Вам очень простое решение для zsh:

ls -d ~/**/*| egrep -v "/.*/.*/.*/"

Если Вы хотите включать точечные файлы также:

ls -d ~/**/*(D)| egrep -v "/.*/.*/.*/"

Они только предполагают, что у Вас нет огромного количества файлов в Вашем доме! Если Вы сделаете, то Вы получите список аргументов слишком длинная ошибка. Но можно столкнуться с подобными ошибками с любым решением, которое дает ответ за один шаг. (Рекурсивная функция звонит также).

0
28.01.2020, 02:52

Теги

Похожие вопросы