LINUX.ORG.RU

for SUBDIR in $(ls -d /some/dir/*/); do ... $SUBDIR; done ?

devl547 ★★★★★
()
Последнее исправление: devl547 (всего исправлений: 2)
Ответ на: комментарий от anonymous

В вашей команде find надёт директории на всех уровнях вложенности, насколько я понимаю ТС нужно заархивировать директории только на первом уровне.

find -mindepth 1 -maxdepth 1 -type d -exec tar -czf "{}.tar.gz" "{}" \;
kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от awesomenickname

Вот здесь:

find -type d ! -name "." | while read i; do
  tar -czvf "$(basename $i).tar.gz" "$i";
done
find найдёт директории на всех уровнях вложенности.

Т.е. если у вас структура директорий выглядит так:

root_dir/
   dir 1/
      sub dir 1/
   dir 2/
      sub dir 2/
         sub sub dir 2/
   dir 3/
      sub dir 3/
то, как ясно, будут созданы не три архива, а 7:
root_dir/
   dir 1/
      sub dir 1/
      sub dir 1.tar.gz
   dir 1.tar.gz
   dir 2/
      sub dir 2/
      sub dir 2.tar.gz
         sub sub dir 2/
         sub dir 1.tar.gz
   dir 2.tar.gz
   dir 3/
      sub dir 3/
      sub dir 3.tar.gz
   dir 3.tar.gz

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

Странно, у меня такая же структура каталогов, что вы описали, но архивирует по первому уровню, что и есть хорошо. Специально проверил и архивов не оказалось внутри.

awesomenickname ★★★★★
() автор топика
Ответ на: комментарий от awesomenickname

Так не может быть, если у вас, конечно не выставлен alias на find, что вряд ли.

Посмотрите вывод:

find -type d ! -name "."

А вот и развязка, почему так, автор предложенного скрипта использует basename:

tar -czvf "$(basename $i).tar.gz" "$i";
В результате выполнения этой команды у вас в верхней директории создастся архив с именем директории на втором, третьем и так далее уровне вложенности и её содержимым.

Т.е. для

root_dir/
   dir 1/
      sub dir 1/
У вас в root_dir/ создастся архив «sub dir 1.tar.gz» и содержимым sub dir 1/ .

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

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

awesomenickname ★★★★★
() автор топика
Ответ на: комментарий от awesomenickname

Я вам же уже написал, вот однострочник:

find -mindepth 1 -maxdepth 1 -type d -exec tar -czf "{}.tar.gz" "{}" \;
или
find -maxdepth 1 -type d ! -name "." -exec tar -czf "{}.tar.gz" "{}" \;

Ну или, если вам так понятнее:

find -maxdepth 1 -type d ! -name "." | while read i; do
  tar -czvf "$i.tar.gz" "$i";
done

kostik87 ★★★★★
()
Ответ на: комментарий от Extraterrestrial

только заменить ls -F | grep / на ls -d */, и плюс/минус этого метода - нет архивов директорий с точкой.

anonymous
()
Ответ на: комментарий от Extraterrestrial

и ещё, как ваш метод относится к пробелам в директориях?

anonymous
()
Ответ на: комментарий от Extraterrestrial
time ls -F | grep /
...
real	0m0.094s
user	0m0.020s
sys	0m0.000s
[/cpde]

time find -mindepth 1 -maxdepth 1 -type d
...
real	0m0.008s
user	0m0.000s
sys	0m0.000s

Я думаю всё ясно.

Вы вызываете две программы, да ещё в for заворачиваете, а в случае с find всего одна программа плюс команда архивации.

kostik87 ★★★★★
()
Ответ на: комментарий от Extraterrestrial

Ну как бы зависит от числа файлов в директории. Ну и как я уже сказал вы предлагаете способ с использованием нескольких команд, к тому же данные прогоняете через конвейер, плюс цикл for. Плюс для того, что бы исключить и из обработки некоторые директории вам нужно задействовать дополнительные программы.

А в find всё это уже собрано воедино, например с помощью printf можно получать дополнительные сведения по файлу.

В общем, я вас понял, вы просто не читали документацию по findutils, хотя бы 'man find'.

kostik87 ★★★★★
()
Ответ на: комментарий от TGZ

В данном конкретном примере да, ну а если нужно сделать не архивацию, а другое действие ?

К тому же легче использовать инструмент, написанный специально для задачи, чем лепить велосипед, плюс ещё его подкручивать, что бы учесть детали.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

легче использовать инструмент, написанный специально для задачи

Не могу не согласиться

TGZ ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.