Я хочу записать программную оболочку, которая пройдет все папки, имена которых соответствуют шаблону как это:
sudo sh shell.sh pub
Когда выполнено, сценарий будет искать все папки, имя которых содержит pub
и распечатайте его дату модификации. Я хочу иметь код, который распечатает результаты как в этом изображении: у Меня есть этот код, но он не дает мне результат, который я ожидаю.
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
Можно использовать 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
.
Можно использовать 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
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 Практических примеров команды находки
Вот небольшое изменение, которое использует -regex
вместо -names
:
find . -type d -regex ".*\($1\).*$" -printf 'The folder %P was modified on %Tb %Td %TH:%TM\n'
Это может быть или однострочным сценарием или еще лучше - функция. Назовите его как так:
./finder.sh 'Vid\|Doc'
Это делает для более идиоматического, grep
- как подход.