Подстановочный знак: путь возврата источника

Решение:

cd /usr/lib/gcc/x86_64-linux-gnu/4.6
sudo ln -s /usr/lib/gcc/x86_64-linux-gnu/4.8/libgfortran.a libgfortran.a
1
задан 9 September 2014 в 01:09

2 ответа

Просто анализируйте и повторно собирайте $file, когда вы перебираете соответствующие файлы: ${file%/*} дает вам $ file со всем после удаления последнего /, а ${file##*/} дает вам $ file со всем до последнего / удален; вместе взятые ${file%/*}/old/$date-${file##*/} дадут вам «новое» имя файла, соответствующее $file.

Предположительно, дата не изменится при запуске вашего скрипта, поэтому нет смысла вызывать date для каждого файла; скорее, сохраните дату в переменной один раз, а затем используйте ее во время цикла: date=$(date '+%G-%m-%d'). (Обратите внимание, что современные скрипты должны использовать $(...), а не обратные ссылки. Также обратите внимание, что % не является «специальным» символом и поэтому не требует кавычек или экранирования, хотя в качестве хорошей практики вся строка формата должна быть цитата.)

Если у вас есть новая версия Bash, вы можете полностью исключить подселлем, используя вместо этого printf -v date '%(%G-%m-%d)T' -1.

Вы также можете счесть полезным использовать shopt -s globstar так что вы можете искать произвольную глубину в каталогах и shopt -s nullglob, чтобы unmatched glob (wildcard) расширялся до «ничего» вместо исходного шаблона glob.

Полагая все это вместе, мы получаем: [ ! d4]

shopt -s globstar nullglob
date=$( date '+%G-%m-%d' )
for file in /home/*/logs/**/access.log.gz
do
    target=${file%/*}/old/$date-${file##*/}
    mv -vi "$file" "$target"
done
1
ответ дан 24 May 2018 в 03:52

Если у вас установлен zsh, используйте zmv. В сценарии:

#!/bin/zsh
autoload zmv
zmv '/home/*/logs/access.log.gz' '$f:h/`date +\%G-\%m-\%d`-$f:t'

В командной строке zsh поместите autoload zmv в свой ~/.zshrc и запустите эту последнюю строку в командной строке.

0
ответ дан 24 May 2018 в 03:52

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

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