2010-04-14 4 views
2

Выполнить рекурсивный список всех файлов в/вар/журнал и перенаправить стандартный вывод в файл с именем lsout.txt в вашем домашнем каталоге. Заполните этот вопрос, не отпуская ваш домашний каталог.Баш: рекурсивный список всех файлов проблемы

An: Ls -R/вар/Журнал /> /home/bqiu/lsout.txt

Я считаю, команда выше баш не является правильным. Потому что я нашел то, что магазины были:

$ ls -R /var/log 
/var/log: 
empty.txt setup.log setup.log.full tmp 

/var/log/tmp: 
fake.txt subfolder 

/var/log/tmp/subfolder: 

Означает ли это, проблема решена?

Я не считаю.

Потому что она содержит больше «материал», чем «только файлы»

Или, по крайней мере, если цель состояла в том, чтобы найти все «файлы» под «/ Var/Журнал» каталог рекурсивно, то я надеюсь, получить anwser так:

/var/log/empty.txt 
/var/log/setup.log 
/var/log/setup.log.full 
/var/log/tmp/fake.txt 

Итак кто-то может анализировать содержимое вывода для последующего использования. Такие, как

$ perl -wnle 'print "$. :" , $_;' logfiles 
1 :/var/log/empty.txt 
2 :/var/log/setup.log 
3 :/var/log/setup.log.full 
4 :/var/log/tmp/fake.txt 

Это то, что я получил до сих пор:

$ ls -1R 
.: 
cal.sh 
cokemachine.sh 
dir 
sort 
test.sh 

./dir: 
afile.txt 
file 
subdir 

./dir/subdir: 

$ ls -R | sed s/^.*://g 

cal.sh 
cokemachine.sh 
dir 
sort 
test.sh 


afile.txt 
file 
subdir 

Но это по-прежнему оставляет все имена каталогов/подкаталог (реж и подкаталогов), плюс пару пустых

переводы строк

Как я могу получить правильный результат без использования Perl или awk? Предпочтительно использовать только базовые команды bash (это только потому, что Perl и awk вышли из области оценки)

Отредактировано: Я сосредоточился на своей папке «$ HOME», чтобы ограничить указанный файл. У меня мало информации в моем homedir

Отредактировано 2-го: Извините за мой неуместный вопрос в исходной форме. Я исправил формулировку и, надеюсь, каждый может увидеть проблему сейчас.

+0

Вопрос непонятен - что это такое * правильно? Должна ли каждая строка конечного вывода иметь форму './Dir/afile.txt'? Только базовые имена? –

+0

Вы пробовали команду 'find'? –

+1

Главное очевидное, что неправильно с предоставленным ответом заключается в том, что выходной файл должен быть «$ HOME/lsout.txt»; ДОМАШНЯЯ ЧАСТЬ ЧЕЛОВЕКА не находится в/home/bqiu. Главное, что неправильно с тем, что вы делаете, похоже, что вы игнорируете запрос для перечисления содержимого/var/log. –

ответ

4

Try -

находкой/вар/Журнал> ~/lsout.txt

+0

Не думайте, что это то, что означало. Кроме того, как вы можете гарантировать, что реализация 'find' не покинет домашний каталог? – vladr

+2

@ Vlad: Я бы позволил оп решить, какой пиптит был желателен. Что касается команды find: «Выход из дома. Домашний каталог - я понятия не имею, о чем вы говорите. Просьба уточнить. – chetan

4

Если вы не получили каких-либо ограничений в терминах команд, которые могут или не могут быть использованы, ls -R /var/log >~/lsout.txt или find /var/log -print >"$HOME/lsout.txt" или любой подобная комбинация будет работать отлично.

Однако если точка задания является написать 100% sh основанную на реализацию, без использования ls -R, find и т.д.то вы должны производить что-то вдоль линий:

#!/bin/sh 

# Helper method which recursively lists the contents of a given directory 
# Usage: recurse_ls target_directory 
recurse_ls() 
{ 
    TARGET_DIR="$1" 
    # list contents of $TARGET_DIR 
    ... 
    # - recursive call to list contents of sub-directories 
    recurse_ls ... 
    ... 
} 



# MAIN 
# Usage: script.sh target_directory 
# - check that parameters to script.sh are correct 
... 
# - list the contents of target_dir and its subdirectories 
recurse_ls "$1" 

Полезные ссылки:

+0

@ Vlad Romascanu: Спасибо за этот образец кода скелета. Этот вопрос оставлен« незавершенным », взятым из я считаю, что «предложенный» ответ в прошлом был не совсем правильным. –

+0

@ Vlad Romascanu: опять же, спасибо за ссылки! –

1

Я бы предположил, что ответ им нужен: ls -R /var/log/ > /home/bqiu/lsout.txt
ie. оригинальный ответ, который вы сказали, был неправильным.

За исключением вы можете написать его как: ls -R /var/log/ > ~/lsout.txt.
Таким образом он выводит в домашний каталог того, кто вошел в систему, а не только пользовательский «bqiu».

Когда он говорит: Run a recursive listing of all the files
мне ls означает listing и вариант -R означает recursive.
Итак, формулировка вопроса предлагает использовать ls -R для составления списка,

Но это зависит от того, какой формат они хотят сделать.