Мне нужно создать сценарий для выполнения команды CLI внутри каждого подкаталога Представьте, что у меня есть основной прямой и внутри 3 подкаталоги. Мне нужно зациклиться в каждом подкаталоге и выполнить действие

В PHP я попробую что-то вроде

foreach( $paths as $path){
   //do something
}

Мой полный сценарий (из комментария)

#!/bin/bash 

path=/home/sebastien/projets/XXXX/customers/Sites/ 
today=$(date +%s) 

for d in $path; do 
  [ -L "${d%/}" ] && continue
  echo "$d" 
  orig=$(stat -c %y ${d} ) 
  epoch=$(date -d "${orig}" +"%s") 
  diff=$(($today-$epoch)) 
  jour=$(($diff/86400)) 
  echo $jour 
  if [ "$jour" -ge 4 ] then 
    cd $d #lando rebuild --y
  fi
done

Как это сделать в скрипте bash, пожалуйста?

0
Sébastien Serre 17 Янв 2022 в 22:35
1
I wilt try something like Как это будет перебирать подкаталоги каталога?
 – 
KamilCuk
17 Янв 2022 в 22:53
path выше — это один каталог. См. ответы ниже, используя либо for d in */; do, либо for d in **/; do (после установки globstar)
 – 
David C. Rankin
17 Янв 2022 в 23:53

3 ответа

Вы можете сделать что-то вроде

paths=(dir1 dir2)
for path in "${paths[@]}"
do
    echo "$path"
done
2
John Kugelman 17 Янв 2022 в 22:52
Спасибо @Nabil, но в этом случае как автоматически определить ПУТИ? Я имею в виду, что в моем случае dir1 и dir2 являются моими подпапками, но я добавлю этот скрипт в задание cron, а имена подпапок неизвестны при создании скрипта.
 – 
Sébastien Serre
17 Янв 2022 в 22:44
Вы создаете пустой массив, затем добавляете значение, затем выполняете цикл for. Массив в bash
 – 
Nabil
17 Янв 2022 в 22:51

Мне нужно зациклиться в каждом подкаталоге и выполнить действие

Тогда сделай это.

for i in */; do
  action "$i"
done
1
KamilCuk 17 Янв 2022 в 22:53
Мой полный сценарий: ``` #!/bin/bash path=/home/sebastien/projets/XXXX/customers/Sites/ today=$(date +%s) for d in $path ; do [ -L "${d%/}" ] && продолжить echo "$d" orig=$(stat -c %y ${d} ) epoch=$(date -d "${orig}" +"% s") diff=$(($today-$epoch)) jour=$(($diff/86400)) echo $jour if [ "$jour" -ge 4 ] then cd $d #lando reboot --y fi done ``` результат: ``` $ sh destroy-lando.sh /home/sebastien/projets/XXXX/customers/Sites/ 6 ~/Bureau$ ``` SИзвините за формат кода, я не могу получить это чисто....
 – 
Sébastien Serre
17 Янв 2022 в 23:12
Вы хотите добавить current=$PWD, чтобы сохранить текущий каталог, а затем после cd "$d" #lando rebuild --y (добавлены двойные кавычки) добавить cd "$current" в качестве следующей строки, чтобы вернуться в рабочий каталог.
 – 
David C. Rankin
17 Янв 2022 в 23:51

С версией GNU bash >= 4.0:

# Enable globstar feature
shopt -s globstar

# glob for all directories recursive and remove trailing /
for dir in **/; do echo "${dir/%\//}"; done

# Disable globstar feature
shopt -u globstar

См .: man bash

1
Cyrus 17 Янв 2022 в 23:38
Вот сценарий: ``` #!/bin/bash path=/home/sebastien/projets/customers/Sites/ # Включить функцию globstar shopt -s globstar # glob для всех рекурсивных каталогов и удалить конечный / для каталога в $path ; сделать эхо "${dir/%\//}"; done # Отключить функцию globstar shopt -u globstar ``` Внутри "Сайтов" у меня есть 2 подкаталога, но результат $ bash destroy-lando.sh /home/sebastien/projets/customers/Sites /home/sebastien/projets /клиенты/Сайты/ $
 – 
Sébastien Serre
17 Янв 2022 в 23:50
Для завершающего /: "${dir%/}"
 – 
Fravadona
18 Янв 2022 в 00:03