помощь сценариев оболочки - PullRequest
0 голосов
/ 22 июня 2011

Это одно из моих домашних заданий.

 Write a shell program, which will take a directory as an argument. 
The script should then print all the regular files in the directory and all 
the recursive directories, with the following information n the given order for 
each of the files 

File name (full name from the specified directory)     file size    owner 

In case the directory argument is not given, the script should assume the 
directory to be the current working directory 

Я не совсем понимаю, как решить эту проблему.Для вывода списка файлов я попытался

ls -R | awk ...
, но я не смог этого сделать, потому что не смог найти подходящий полевой разделитель для awk.Я знаю, что несправедливо просить о решении, но, пожалуйста, не могли бы вы, ребята, дать мне подсказку, как решить эту проблему?Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 22 июня 2011

Вы действительно не хотите использовать ls и awk для этого.Вместо этого вы хотите проверить документацию для find, чтобы выяснить, какую строку поместить в следующий скрипт:

find ${1:-.} -type f -printf "format-string-to-be-determined-by-reader\n"
2 голосов
/ 22 июня 2011

Проблема в том, что синтаксический анализ выходных данных ls в лучшем случае сложен, а в худшем - опасен.

Вам нужно будет использовать find, чтобы получить список файлов и небольшой файл.сценарий оболочки, чтобы произвести вывод, который вы хотите.Несмотря на то, что существует множество возможных способов сделать это, я бы использовал следующую общую форму

while read -r file ; do
    # retrieve information about $file
    # print that information on one line
done < <(find ...)

с подходящей командой find для выбора файлов.Чтобы получить метаданные о файлах, я бы использовал stat внутри цикла, возможно, несколько раз.

Надеюсь, хватит намека, но если вам нужен полный ответ, я могу предоставить.

0 голосов
/ 23 июня 2011

Ба. Где проблема в использовании ls или find? Можно также написать однострочный в Perl, чтобы сделать всю работу, а затем просто вызвать однострочный из сценария. ;)

Вы можете сделать свой рекурсивный обход каталога в оболочке и использовать stat для определения размера и владельца. По сути, вы пишете функцию для отображения каталога (для элемента в *), и вам нужно изменить функцию на каталог и вызвать себя, если [[-d $ element]] равно true. Что-то вроде

do_print "$elem"
if [[ -d "$elem" ]]
then
  cd "$elem"
  process_dir
  cd ..
fi

или что-то похожее на это.

Да, у вас будет миллион системных вызовов stat, но IMHO, это, вероятно, предпочтительнее, чем машинный анализ выходных данных программы, вывод которой предназначен для чтения человеком. В этом случае, когда производительность не является проблемой, она того стоит.

Для бонусных супер счастливых забавных моментов замените значение IFS на значение, которое не будет отображаться в имени файла, чтобы не допустить путаницы с оболочкой в ​​файлах, содержащих пробел в своем имени. Я бы предложил либо новую строку, либо косую черту.

Или воспользуйтесь легким выходом и просто используйте find с printf. :)

0 голосов
/ 22 июня 2011

awk в порядке .. используйте " +" в качестве разделителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...