Решено: Cкрипт перебора имён директорий в папке (подскажите "как"?)

Модератор: Модераторы разделов

Аватара пользователя
Doka
Сообщения: 715
Статус: ASIC Design Engineer
ОС: RHEL4

Решено: Cкрипт перебора имён директорий в папке

Сообщение Doka » 10.05.2007 20:35

пишу скрипт, делающий суточный бэкап. бэкапить надо все папки в определённой директории и в общем случае число папок может меняться (как и названия). хочется это дело автоматизировать.

тут еще особенность в том, что каждую подпапку надо прежде специальным образом обработать:

Код: Выделить всё

 svnadmin dump /home/svn/repository01 > repository01.dump
svnadmin dump /home/svn/repository_best > repository_best.dump
...
svnadmin dump /home/svn/my_rep > my_rep.dump


на уме вертится применение команды ls -D и цикла:

Код: Выделить всё

for .. ... do
   ...
done


но пока что квалификация не позволяет понять как извечь имена всех директорий в папке. (только 1й уровень вложенности)

подскажите куда копать
Never stop thinking..................................................................
Спасибо сказали:

Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение nesk » 10.05.2007 20:40

for i in * ; do
rm $i
done
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:

Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение nesk » 10.05.2007 20:54

find /home/svn -type d -exec dump {} > {}.dump \;
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:

Аватара пользователя
Doka
Сообщения: 715
Статус: ASIC Design Engineer
ОС: RHEL4

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение Doka » 10.05.2007 20:57

nesk писал(а):
10.05.2007 20:54
find /home/svn -type d

выводит ВСЕ поддиректории любого уровня вложенности (

nesk писал(а):
10.05.2007 20:40
for i in * ; do
rm $i
done

а подробнее про выделенный параметр можно?
Never stop thinking..................................................................
Спасибо сказали:

Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение nesk » 10.05.2007 21:04

Doka писал(а):
10.05.2007 20:57
выводит ВСЕ поддиректории любого уровня вложенности (


а подробнее про выделенный параметр можно?


у файнда полно ключей :)
есть например такие
-maxdepth
-mindepth
и еще много разных

*
символ генерации имен файлов

вообще там может быть список параметров которые будут по очереди подставлятся в переменную i

можно так
for i in `ls ` ; do echo $i ; done
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:

Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение Uncle_Theodore » 10.05.2007 21:06

nesk писал(а):
10.05.2007 20:40
for i in * ; do
rm $i
done


Я не очень понял Вашей шутки. Не соблаговолите объяснить?
Зачем Вы предлагаете пользователю стереть все файлы в текущей директории?
Я жду объяснений.

Doka писал(а):
10.05.2007 20:57
а подробнее про выделенный параметр можно?

* -- это маска заменяющая любое имя или символ.
Спасибо сказали:

Аватара пользователя
Doka
Сообщения: 715
Статус: ASIC Design Engineer
ОС: RHEL4

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение Doka » 10.05.2007 21:11

Uncle_Theodore писал(а):
10.05.2007 21:06
Я не очень понял Вашей шутки. Не соблаговолите объяснить?
Зачем Вы предлагаете пользователю стереть все файлы в текущей директории?

ну на то он и бэкап, чтобы в т.ч. и от таких ситуаций страховаться :rolleyes:

nesk писал(а):
10.05.2007 21:04
можно так
for i in `ls ` ; do echo $i ; done


спасибо!!!! :laugh:
Never stop thinking..................................................................
Спасибо сказали:

Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение Uncle_Theodore » 10.05.2007 21:16

nesk, у Вас есть еще пять минут, чтобы предоставить вразумительное объяснение Вашей шутки. Если через пять минут я его тут не увижу, Вы отправитесь в бан размышлять о том, о чем следует шутить, а о чем нет.
Спасибо сказали:

Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение nesk » 10.05.2007 21:19

Учтите, что по умолчанию разделителем в списке in является пробел, тоесть если в имени файла есть пробелы, то части имени файла будут обрабатываться отдельно.
так что это решение в чистом виде не подходит :)

Воля Ваша.
Один день бана.

UT
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:

Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение agbr » 10.05.2007 21:20

Код: Выделить всё

ls | while read file;do echo "|$file|";done


это показывает, как избежать гемора с пробелами :)
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:

Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение nesk » 10.05.2007 21:21

Uncle_Theodore писал(а):
10.05.2007 21:16
Зачем Вы предлагаете пользователю стереть все файлы в текущей директории?
Я жду объяснений.

nesk, у Вас есть еще пять минут, чтобы предоставить вразумительное объяснение Вашей шутки. Если через пять минут я его тут не увижу, Вы отправитесь в бан размышлять о том, о чем следует шутить, а о чем нет.


Я никому ничего не предлогаю, просто пример цикла for при работе с содержимым каталога.

Не очень то и хотелось :)

прощайте
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:

Аватара пользователя
Doka
Сообщения: 715
Статус: ASIC Design Engineer
ОС: RHEL4

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение Doka » 10.05.2007 21:25

nesk писал(а):
10.05.2007 21:19
Учтите, что по умолчанию разделителем в списке in является пробел, тоесть если в имени файла есть пробелы, то части имени файла будут обрабатываться отдельно.
так что это решение в чистом виде не подходит :)

мне это как раз подходит - правила создания директорий в той папке написаны: пробел туда может забраться только по ошибке
Never stop thinking..................................................................
Спасибо сказали:

Аватара пользователя
Doka
Сообщения: 715
Статус: ASIC Design Engineer
ОС: RHEL4

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение Doka » 10.05.2007 22:34

маленький вопрос: а есть ли у ls опция для вывода только списка директорий (не файлов) ??
что-то по ls --help не узрел нужного ключика(
Never stop thinking..................................................................
Спасибо сказали:

Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение agbr » 10.05.2007 22:59

Doka писал(а):
10.05.2007 22:34
маленький вопрос: а есть ли у ls опция для вывода только списка директорий (не файлов) ??
что-то по ls --help не узрел нужного ключика(


зачем ls?

Код: Выделить всё

find -maxdepth 1 -type d | while read i;do echo $i;done
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:

Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение Uncle_Theodore » 10.05.2007 23:05

На выбор

ls -l | grep "^d"
tree -d -L 1
ls -d */
ls -d */ | xargs -l basename
echo */
find . -type d -maxdepth 1 -mindepth 1
Спасибо сказали:

Аватара пользователя
Doka
Сообщения: 715
Статус: ASIC Design Engineer
ОС: RHEL4

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение Doka » 10.05.2007 23:29

Uncle_Theodore писал(а):
10.05.2007 23:05
На выбор

ls -l | grep "^d"
tree -d -L 1
ls -d */
ls -d */ | xargs -l basename
echo */
find . -type d -maxdepth 1 -mindepth 1


Код: Выделить всё

[doka@dokasrv ppp]$ ls -l | grep "^d"
drwxr-xr-x  3 root root 4096 Apr  1 12:37 peers
[doka@dokasrv ppp]$ tree -d -L 1
bash: tree: command not found
[doka@dokasrv ppp]$ ls -d */
peers/
[doka@dokasrv ppp]$ ls -d */ | xargs -l basename
peers
[doka@dokasrv ppp]$ echo */
peers/
[doka@dokasrv ppp]$ find . -type d -maxdepth 1 -mindepth 1
./peers


поскольку параметр-имя_директории будет использовано как имя файла то подходит только вариант "ls -d */ | xargs -l basename" (чтобы без слешей имя было).

спасибо за помощь.
Never stop thinking..................................................................
Спасибо сказали:

Аватара пользователя
Славик
Сообщения: 159
ОС: AltLinux2.4 master

Re: Решено: Cкрипт перебора имён директорий в папке

Сообщение Славик » 07.06.2007 23:00

Я тут случайно проходил мимо.
У меня эта задачка решилась так:

Код:

#!/bin/bash if [ "$#" = 0 ]; then echo "Usage: $0 catalog" exit fi CATALOG="$1" if [ ! -z "$CATALOG" ]; then if [ -d "$CATALOG" ]; then for current in $CATALOG/*; do [ -d $current ] && echo "$current" done fi fi exit 0


Сохраняем это все в исполняемом файле и в консоли пишем:
$ scriptname catalog
Познание бесконечности требует бесконечного времени.
А. и Б. Стругацкие
Понедельник начинается в субботу
Спасибо сказали: