Ваш вопрос мне не совсем ясен, но я думаю, мог бы понять, что вы пытаетесь сделать.
Вот этот цикл, который вы используете:
for x in /home/tb/temp/*.pdf
do
d="${x:4:4}-${x:8:2}-${x:10:2}"
mkdir -p "$d"
mv -- "$x" "$d/"
done
Примеры имен файлов, которые вы дали, были:
Dispatch Fax_20180521121901.pdf
Dispatch_20180521124202.pdf
Одна проблема, которая бросается мне в глаза, заключается в том, что ваше выражение подстановки параметра -(d="${x:4:4}-${x:8:2}-${x:10:2}"
), похоже, не дает правильных результатов, например.:
> x='Dispatch Fax_20180521121901.pdf'
> d="${x:4:4}-${x:8:2}-${x:10:2}"
> echo ${d}
atch- F-ax
> x='Dispatch_20180521124202.pdf'
> d="${x:4:4}-${x:8:2}-${x:10:2}"
> echo ${d}
atch-_2-01
Вместо этого вы можете попробовать использовать grep
, например.:
> x='Dispatch Fax_20180521121901.pdf'
> d=$(echo "${x}" | grep -Po '\d{8}')
> echo ${d}
20180521
> x='Dispatch Fax_20180521121901.pdf'
> d=$(echo "${x}" | grep -Po '\d{8}')
> echo ${d}
20180521
Или, если вы хотите добавить дефисы, вы можете использовать следующую команду на основеsed
--замену:
> x='Dispatch Fax_20180521121901.pdf'
> d=$(echo "${x}" | sed -E 's/^[^0-9]*([0-9]{4})([0-9]{2})([0-9]{2}).*$/\1-\2-\3/')
> echo ${d}
2018-05-21
> x='Dispatch Fax_20180521121901.pdf'
> d=$(echo "${x}" | sed -E 's/^[^0-9]*([0-9]{4})([0-9]{2})([0-9]{2}).*$/\1-\2-\3/')
> echo ${d}
2018-05-21
Предполагая, что это желаемый результат (, т. е. что вам нужны подкаталоги формы %Y-%m-%d
), мы могли бы заменить ваше выражение подстановки параметра -подстановкой команды -на основе grep
-. Вместо этого мы получили бы следующий модифицированный цикл:
for filename in /home/tb/temp/*.pdf; do
datestring=$(echo "${filename}" | sed -E 's/^[^0-9]*([0-9]{4})([0-9]{2})([0-9]{2}).*$/\1-\2-\3/')
mkdir -p "${datestring}"
mv -i -- "${filename}" "${datestring}/"
done
Это должно создать подкаталоги вида %Y-%m-%d
и заполнить их соответствующими файлами.
ОБНОВЛЕНИЕ:Основываясь на вашем комментарии,похоже, что вам нужны вложенные подкаталоги формы %Y/%m/%d
. Для этого вам нужно будет извлечь подстроки года, месяца и дня отдельно, например.:
> x='Dispatch Fax_20180521121901.pdf'
> d=$(echo "${x}" | grep -Po '\d{8}')
> year=${d:0:4}
> month=${d:4:2}
> day=${d:6:2}
> echo "${year}/${month}/${day}/"
2018/05/21/
Это приводит нас к следующему циклу:
for filename in /home/tb/temp/*.pdf; do
datestring=$(echo "${filename}" | grep -Po '\d{8}')
year=${datestring:0:4}
month=${datestring:4:2}
day=${datestring:6:2}
directory="${year}/${month}/${day}/"
mkdir -p "${directory}"
mv -i -- "${filename}" "${directory}"
done
Вы должны использовать двойные кавычки, чтобы получить расширение переменной. Чтобы напечатать буквальные двойные кавычки внутри двойных кавычек, вы должны их экранировать:
osascript -e "display notification \"${RSYNC1}\" with title \"Backup\""
В качестве альтернативы используйте одинарные кавычки внутри двойных кавычек:
osascript -e "display notification '${RSYNC1}' with title 'Backup'"