Я ищу способ рекурсивного получения путей ко всем файлам в данном каталоге в UNIX. (без использования find)
Пример:
Учитывая дерево, как это
lab_assignment:
file1.txt
file2.txt
subdir1
subdir2
./subdir1:
file11.txt
./subdir2:
file21.txt
Мне нужна команда, которая бы рекурсивно перечисляла пути ко всем файлам, содержащимся в lab_assignment.
./file1.txt
./file2.txt
./subdir1/file11.txt
./subdir2/file21.txt
Я нашел это в задании, поэтому набор инструментов был намеренно ограничен. Я знаю, что вы можете сделать это легко с помощью команды find
, но это назначение не позволило использовать find
, поэтому должен быть способ сделать это без find
, но я не смог прийти с одним.
Учитель сказал нам, что этого можно достичь, используя только ls
, цитату и, возможно, трубы и grep
.
UPDATE:
Я столкнулся с этой проблемой в недавнем задании, хотя это не было основной целью. Из-за этого мне удалось полностью избежать этой проблемы, но позже мне стало любопытно, каким было правильное решение для нее.
Решение этой проблемы используется в таких задачах, как:
Рекурсивный вывод констант файлов, имена которых заканчиваются на .txt
Рекурсивно считать количество строк во всех файлах, имена которых начинаются с f
Утилиты like
cat и wc
работают с именами файлов, указанными в их stdin, и не имеют встроенной рекурсивной функциональности, поэтому вы должны предоставить список путей к файлам.
Гадкий путь
Я решил по возможности избежать проблемы и сделал это:
cat *.txt */*.txt */*/*.txt
wc -l f* */f* */*/f*`
Это сработало. Учитель выглядел довольно недовольным, называя этот метод грязным и безобразным, но он принял мой доклад. Мне было любопытно, как мне это сделать.
Сломанный путь
После того, как учитель провёл более месяца, он согласился показать мне правильный способ, которым можно было бы сделать это.
Он напечатал это:
cat `ls -R $PWD`
Казалось, это только приводит к ошибкам и не создает ничего похожего на нужный результат.
Затем он придумал:
cat $PWD/`ls -R`
Эта вещь хоть что-то сделала, но все же - даже близко не к требуемому результату.
Затем учитель сказал мне, что это был его первый год, когда он читал этот курс, который был разработан давно другим отделением универа, и что он, как пользователь UNIX, просто сделает это с find
и он не знает решения
но он клянется, что, должно быть, видел это где-то в документации для курса или где-то еще ...
Итак, есть ли способ получить рекурсивный список путей к файлам без поиска?
Какой умный кусок UNIX-хитрости и умственной гимнастики является ключом к этому?