ls'ing через все дерево каталогов для создания одного pipeable списка файлов

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

all=false
long=false

while getopts ":hal" option; do
  case $option in
    h) echo "usage: $0 [-h] [-a] [-l] file ..."; exit ;;
    a) all=true ;;
    l) long=true ;;
    ?) echo "error: option -$OPTARG is not implemented"; exit ;;
  esac
done

# remove the options from the positional parameters
shift $(( OPTIND - 1 ))

ls_opts=()
$all && ls_opts+=( -a )
$long && ls_opts+=( -l )

# now, do it
ls "${ls_opts[@]}" "$@"
4
20.09.2010, 23:15
2 ответа

Я думаю, что Ваш лучший выбор find команда. Если Вы хотите просто файлы а не каталоги в Вашем списке, чем-то вроде этого:

find directory/ -type f -print > textfile

Команда находки рекурсивно перечислит файлы. (Если Вы хотите каталоги, перечисленные также, удаляете -type f). > textfile перенаправления stdout в файл назвали текстовый файл без потребности в кошке.

find мощный инструмент со многими опциями. Посмотрите man find если Вы находите, что необходимо настроить вывод немного.

ОБНОВЛЕНИЕ (благодарит gvkv):

Если Вы хотите поместить содержание файлов в единственный текстовый файл, то один способ сделать это:

find Documents/ -type f -exec cat {} + > textfile
10
27.01.2020, 20:47
  • 1
    , Если требуется распечатать только имя файла, не полный путь, использовать -printf '%f\n' вместо -print. –  Adam Byrtek 21.09.2010, 01:53
  • 2
    OP хочет список файлов в текстовом файле или содержании файлов в текстовом файле? Я интерпретировал вопрос как последний. положительная сторона –  gvkv 21.09.2010, 02:57
  • 3
    @gvkv. Я обновлю свой ответ. –  Steven D 21.09.2010, 03:13
  • 4
    xargs вместо - должностное лицо для лучшей эффективности процесса. –  jmtd 25.09.2010, 01:22
  • 5
    @jmtd: Согласно странице справочника, + вместо \; должно быть примерно то же как использующий xargs. –  Steven D 25.09.2010, 05:09

find универсальный путь, как ответ D Steven объясняет. Если Ваша оболочка поддерживает его, ** может использоваться для соответствия любому количеству подкаталогов (на ударе, которым оно совпадает с * и только соответствия один по умолчанию, но видят комментарий Dennis), таким образом, можно просто сделать:

cat **/*
3
27.01.2020, 20:47
  • 1
    , где Вы изучаете этот материал?Потрясающе! –  gvkv 21.09.2010, 02:56
  • 2
    изучает это? micheal пишет это здесь сначала, затем взламывает ВАШ (и все elses) ПК и реализует поведение там. +1 @micheal –  Stefan 21.09.2010, 10:57
  • 3
    Bash 4 сделает это если Вы shopt -s globstar. –  Paused until further notice. 21.09.2010, 19:06
  • 4
    @gvkv: Вероятно, путем Чтения Дружественного Ручного :) –  Adam Byrtek 21.09.2010, 21:20
  • 5
    @Michael Mrozek, за пределами которого я никогда не рисковал, избивает мои 8 лет на Linux. Я услышал хорошие вещи о zsh, все же. –  ixtmixilix 27.09.2010, 17:13

Теги

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