окружите для печати даты модификации всего шаблона соответствия названия каталогов

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

sudo sh  shell.sh   pub 

Когда выполнено, сценарий будет искать все папки, имя которых содержит pub и распечатайте его дату модификации. Я хочу иметь код, который распечатает результаты как в этом изображении:enter image description here у Меня есть этот код, но он не дает мне результат, который я ожидаю.

echo  'the folder '$1' was modified at ';
 find  -type d -name 'kam*'  -exec stat -c '%y %n' '{}' \;

Я должен пройти каждую папку и синтезируемый текст echo 'the file '$1' was modified at '; и распечатайте дату как в изображении.

Я хотел бы результат как это:

netcom@hotspot:~$ bash script.sh testRegex Pub
the folder testRegex was modified on may 15 01:19
 the folder Public was modified on may 19 01:19 
  the folder Pubos was modified on may 19 01:19 
4
задан 7 June 2018 в 16:15

4 ответа

Можно использовать find самостоятельно распечатать все это:

for pattern
do
    find . -type d -name "*$pattern*" -printf 'The folder %P was modified on %t\n'
done

for pattern; do ... done циклы по всем аргументам, с pattern переменный набор к каждому аргументу в свою очередь.

С find, %P и %t дайте путь к файлу и время изменения в -printf.

6
ответ дан 23 November 2019 в 11:35

Можно использовать bash с globstar опция включила как в следующем сценарии:

#!/bin/bash
shopt -s globstar
for i
  do for k in **/"$i"*/
    do stat -c "the folder %n was modified on %y" "$k"
  done
done

Сохраните его как script, сделайте это исполняемым файлом с chmod +x script и назовите его, поскольку Вы хотели это:

bash /path/to/script testRegex Pub

Обратите внимание, что это будет искать, например. Pub*, если Вы на самом деле хотите соответствовать *Pub*, изменение **/"$i"*/ кому: **/*"$i"*/. Если Вы хотите сократить метку времени, попытайтесь добавить | sed 's/:[^:]*$//' в конец do stat строка. Необходимо также попробовать %N вместо %n, особенно когда дело доходит до имен каталогов с пробелами этот формат предпочтителен.

Если Вы хотите более мелкомодульное управление форматом даты, можно использовать date, займите место do stat строка со следующим:

do date -d@$(stat -c%Y "$k") +"the folder $k was modified on %b %d %R"

Можно затем использовать обычное date последовательности формата, объясненные в man date, этот здесь печатает, например. May 15 01:19 поскольку Вы запросили.

Наконец, что не менее важно, к структурной распечатке программы вывод любого из вышеупомянутых можно вставить вкладку после имени каталога и использования column следующим образом:

#!/bin/bash
shopt -s globstar
for i
  do for k in **/"$i"*/
    do date -d@$(stat -c%Y "$k") +"the folder $k%twas modified on %b %d %R"
  done
done | column -ts$'\t'

Пример выполняется

$ tree
.
├── 1
│  └── 1
│  └── 1
├── 1something
└── 2
   └── 1
$ bash -O globstar -c 'for i; do for k in **/"$i"*/; do stat -c "the folder %n was modified on %y" "$k"; done; done' _ 1
the folder 1/ was modified on 2018-06-07 09:45:28.098693507 +0200
the folder 1/1/ was modified on 2018-06-07 09:45:28.098693507 +0200
the folder 1/1/1/ was modified on 2018-06-07 09:45:28.098693507 +0200
the folder 1something/ was modified on 2018-06-07 09:55:36.066531665 +0200
the folder 2/1/ was modified on 2018-06-07 09:45:28.098693507 +0200
$ bash -O globstar -c 'for i; do for k in **/"$i"*/; do stat -c "the folder %n was modified on %y" "$k" | sed 's/:[^:]*$//'; done; done' _ 1
the folder 1/ was modified on 2018-06-07 09:45
the folder 1/1/ was modified on 2018-06-07 09:45
the folder 1/1/1/ was modified on 2018-06-07 09:45
the folder 1something/ was modified on 2018-06-07 09:55
the folder 2/1/ was modified on 2018-06-07 09:45
$ bash -O globstar -c 'for i; do for k in **/"$i"*/; do date -d@$(stat -c%Y "$k") +"the folder $k was modified on %b %d %R"; done; done' _ 1
the folder 1/ was modified on Jun 07 09:45
the folder 1/1/ was modified on Jun 07 09:45
the folder 1/1/1/ was modified on Jun 07 09:45
the folder 1something/ was modified on Jun 07 09:55
the folder 2/1/ was modified on Jun 07 09:45
$ bash -O globstar -c 'for i; do for k in **/"$i"*/; do date -d@$(stat -c%Y "$k") +"the folder $k%twas modified on %b %d %R"; done; done | column -ts'"$'\t'" _ 1
the folder 1/           was modified on Jun 07 09:45
the folder 1/1/         was modified on Jun 07 09:45
the folder 1/1/1/       was modified on Jun 07 09:45
the folder 1something/  was modified on Jun 07 09:55
the folder 2/1/         was modified on Jun 07 09:45
5
ответ дан 23 November 2019 в 11:35

find команда может сделать то, в чем Вы нуждаетесь с одной строкой

Можно взглянуть на printf действие в find
Посмотритеman find для деталей параметров printf

Пример

find /PATH/TO/SCAN -type d -iname '*pub*' -printf "%p %TY-%Tm-%Td %TH:%TM\n"

-type d        : search for folders
-iname '*pub*' : find the pattern case insensitive
%p             : display path of found folder
%TY            : time Year 
%Tm            : time month
%Td            : time day
%TH            : time hour
%TM            : time minutes
%TS            : time seconds


Для получения дополнительной информации
Официальная веб-страница для GNU находит
25 Практических примеров команды находки

4
ответ дан 23 November 2019 в 11:35

Вот небольшое изменение, которое использует -regex вместо -names:

find . -type d -regex ".*\($1\).*$" -printf 'The folder %P was modified on %Tb %Td %TH:%TM\n'

Это может быть или однострочным сценарием или еще лучше - функция. Назовите его как так:

./finder.sh 'Vid\|Doc'

Это делает для более идиоматического, grep- как подход.

2
ответ дан 23 November 2019 в 11:35

Другие вопросы по тегам:

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