Автор Гілка: Список файлів у рядок  (Прочитано 5417 раз)

Відсутній noddeat

  • Кореспондент
  • ***
  • дописів: 197
  • Карма: +0/-0
як вивести список файлів каталогу у рядок, а не в стовпчик, як у ls?
потрібно щось типу такого:
ls | grep pdf
і результат передати до
pdftk список_pdf_файлів_у_рядок cat output merged.pdf
Filenames are infinite in length, where infinity is set to to 255 characters. Peter Collinson, "The Unix File System"

Михайло Даниленко(Guest)

  • Гість
Re: Список файлів у рядок
« Відповідей #1 : 2007-11-28 02:36:48 »
Найпростіше:
*.pdf # bash при компонуванні рядку зробить все що треба, й файли з пробілами тоді не проблема.

`ls *.pdf` # на файлах з пробілами обломиться

`ls | grep pdf` # те ж саме, тільки видасть не *.pdf, a *pdf*

Михайло Даниленко(Guest)

  • Гість
Re: Список файлів у рядок
« Відповідей #2 : 2007-11-28 02:45:03 »
Найскладніше, зате найнадійніше:

filelist=( *.pdf )

if [ "${filelist[0]}" == '*.pdf' ] ; then
      echo "Error, no pdf files found"
fi

# перевірка, підготовка, ... списку

cmd "${filelist
  • }" addargs[/tt]

Відсутній Cthulhu

  • Кореспондент
  • ***
  • дописів: 183
  • Карма: +0/-0
Re: Список файлів у рядок
« Відповідей #3 : 2007-11-28 03:45:36 »
А не простіше "find . -type f -name "*pdf" -print0 -exec 'command' {} +"?


Або find . -type f -name "*pdf" -print0 | xargs -0 'command'
« Змінено: 2007-11-28 03:55:05 від Cthulhu »

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: Список файлів у рядок
« Відповідей #4 : 2007-11-28 04:16:14 »
Flame:
Простіше за що? За *.pdf ;)? Як я зрозумів, файли з підтек - не потрібні.
« Змінено: 2007-11-28 04:17:01 від ISBear »

Відсутній Cthulhu

  • Кореспондент
  • ***
  • дописів: 183
  • Карма: +0/-0
Re: Список файлів у рядок
« Відповідей #5 : 2007-11-28 11:21:35 »
Flame:
Простіше за що? За *.pdf ;)? Як я зрозумів, файли з підтек - не потрібні.
Ну, може в людини назви файлів з усякими там спецсимволами і іншою какою?=))

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: Список файлів у рядок
« Відповідей #6 : 2007-11-28 12:18:41 »
Flame:
Тим більше :)
bash, здається, має нормально таке сприймати й все, що треба - ескейпити. Принаймні, для [$`#; {,}] це так.
P.S. для \n - також
P.P.S. для файлу з назвою a\tb\nc\rd\e[31mf - також (створювався як touch $'a\tb\nc\rd\e[31mf').
« Змінено: 2007-11-28 12:33:27 від ISBear »

Відсутній noddeat

  • Кореспондент
  • ***
  • дописів: 197
  • Карма: +0/-0
Re: Список файлів у рядок
« Відповідей #7 : 2007-11-28 13:32:50 »
ну мені насправді потрібні файли *.pdf* (типу file.pdf, file2.pdf.1, file3.pdf.4 ...) у поточній теці.
дякую за поміч, буду пробувати
Filenames are infinite in length, where infinity is set to to 255 characters. Peter Collinson, "The Unix File System"

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: Список файлів у рядок
« Відповідей #8 : 2007-11-28 13:51:55 »
Тоді дійсно *.pdf*

P.S. У варіанті з grep - '\.pdf', а то з 'pdf' воно знайде й щось типу updfiles.sh
« Змінено: 2007-11-28 13:53:37 від ISBear »

Відсутній noddeat

  • Кореспондент
  • ***
  • дописів: 197
  • Карма: +0/-0
Re: Список файлів у рядок
« Відповідей #9 : 2007-11-29 00:25:36 »
А не простіше "find . -type f -name "*pdf" -print0 -exec 'command' {} +"?


Або find . -type f -name "*pdf" -print0 | xargs -0 'command'
плюсик означає, що всі знайдені файли будуть передані як арґументи до  команди?
Виникає питання для обох запропонованих варіантів: як його відсортувати за датою (ASC)?
Filenames are infinite in length, where infinity is set to to 255 characters. Peter Collinson, "The Unix File System"

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: Список файлів у рядок
« Відповідей #10 : 2007-11-29 01:03:24 »
filelist=( *.pdf )

if [ "${filelist[0]}" == '*.pdf' ] ; then
      echo "Error, no pdf files found"
fi

for ((i=0; ++i < ${#fl
  • };)) ; do

      j=$i
      while [ "${fl[j-1]}"
-ot "${fl[j]}" ] ; do
            t="${fl[j-1]}"
            fl[j-1]="${fl[j]}"
            fl[j]="${t}"
            ((j > 1)) && ((j--))
      done
done


cmd "${filelist
  • }" addargs[/tt]
Хоча оце я тільки перевірив, чи працює - на дуже тестував.
Якщо я вас неправильно зрозумів щодо порядку - змініть оте -ot (older than) на -nt .

P.S. Сортує за датою останньої модифікації.
P.P.S. Трохи змінив вираз обміну двох комірок - прибрав додаткову змінну, та й виглядає воно зрозуміліше.
P.P.P.S. Подумав, й повернув назад - там можливі глюки з ненормальними символами в назві файлу.
« Змінено: 2007-11-29 01:18:02 від ISBear »

Відсутній noddeat

  • Кореспондент
  • ***
  • дописів: 197
  • Карма: +0/-0
Re: Список файлів у рядок
« Відповідей #11 : 2007-11-29 19:57:04 »
дякую ще раз. обійшовся без сортування, бо воно не допомогло.

зробив так:

fl=( *.pdf.* )
list = "fulltext.pdf"
for ((i=1; ++i < ${#fl[@]}+1;))  do
    list += " fulltext.pdf.$i"
done
...
« Змінено: 2007-11-29 19:57:21 від noddeat »
Filenames are infinite in length, where infinity is set to to 255 characters. Peter Collinson, "The Unix File System"

Відсутній BM

  • Кореспондент
  • ***
  • дописів: 162
  • Карма: +0/-0
  • SUSE Linux Products GmbH
Re: Список файлів у рядок
« Відповідей #12 : 2007-12-17 02:26:22 »
filelist=( *.pdf )

if [ "${filelist[0]}" == '*.pdf' ] ; then
      echo "Error, no pdf files found"
fi

for ((i=0; ++i < ${#fl
  • };)) ; do

      j=$i
      while [ "${fl[j-1]}"
-ot "${fl[j]}" ] ; do
            t="${fl[j-1]}"
            fl[j-1]="${fl[j]}"
            fl[j]="${t}"
            ((j > 1)) && ((j--))
      done
done


cmd "${filelist
  • }" addargs[/tt]
Хоча оце я тільки перевірив, чи працює - на дуже тестував.
Якщо я вас неправильно зрозумів щодо порядку - змініть оте -ot (older than) на -nt .

P.S. Сортує за датою останньої модифікації.
P.P.S. Трохи змінив вираз обміну двох комірок - прибрав додаткову змінну, та й виглядає воно зрозуміліше.
P.P.P.S. Подумав, й повернув назад - там можливі глюки з ненормальними символами в назві файлу.

Зрозуміліше?.. ;D Ваше ще-й не спрацює, якщо файл буде WIN32DOCU~.PDF, а не win32docu~.pdf ...

#!/usr/bin/python
import os
cmd = "pdftk %s cat output merged.pdf"
os.system(cmd % ' '.join(sorted([fn for fn in os.listdir('.') if fn.lower().endswith('.pdf')])))

А можна ще взяти арґумент щоби замінити "merged", а також посортувати по даті, користувачу або величині через os.stat(....) якщо дуже-дуже треба. Це ще два додаткових рядки...

« Змінено: 2007-12-17 02:39:24 від BM »

Михайло Даниленко

  • Гість
Re: Список файлів у рядок
« Відповідей #13 : 2007-12-17 03:02:37 »
#! /usr/bin/perl -w --

opendir DIR, '.';
my @list = sort grep /\.pdf$/i, readdir DIR;
exec "echo @list merge.pdf";


Зрозуміліше? =P
Сортування за чим завгодно додається у нуль рядків.

Відсутній BM

  • Кореспондент
  • ***
  • дописів: 162
  • Карма: +0/-0
  • SUSE Linux Products GmbH
Re: Список файлів у рядок
« Відповідей #14 : 2007-12-17 13:44:07 »
#! /usr/bin/perl -w --

opendir DIR, '.';
my @list = sort grep /\.pdf$/i, readdir DIR;
exec "echo @list merge.pdf";


Так-би й одразу. Щоправда мені така седутивнісь не елегантна, але хоч набагато краще ніж попередній варіянт.