У меня есть много каталогов с именем 201801XX_samename_stillsame
, где XX
изменяется, а остальные остаются прежними. Внутри находятся файлы с одинаковыми именами, например. filename.png
. Мне понадобится сценарий bash
, чтобы изменить filename.png
в соответствии с переменной частью имени каталога, например.
for file in **_samename_stillsame/; do
#extract portion of the name as e.g., $date
cp filename.png "$date".png
for dir in 201801*_samename_stillsame/; do
cp "$dir/filename.png" "${dir:7:2}.png"
done
для каждого каталога скопируйте файл. ${dir:7:2}
— это подстрока переменной, 2 символа от 7-го символа (т.е. часть «ХХ»).
Вы можете использовать:
shopt -s nullglob
kn='_samename_stillsame/'
for f in **"$kn"; do
mv -- "$f/filename.png" "$f${f%%$kn}.png"
done
for d in $(ls -d 2018*_samename_stillsame); do
mv $d/{filename,$(echo "$d" | cut -d '_' -f1)}.png;
done
Обновлено: на основе ответа @kamil-cuk и потому, что я не понимал, что вы просто хотели ХХ часть
for d in $(ls -d 2018*_samename_stillsame); do
mv $d/{filename,${d:6:2}}.png;
done
В моем случае при тестировании индекс фактически начинается с 0, а не с 1, поэтому, чтобы иметь седьмой символ, вам нужно разрезать на 6
Найдите все имена каталогов, используйте sed
для создания команды mv
и параметр e
для выполнения созданной команды.
find 201801* -maxdepth 1 -type d |
sed -r 's#201801(..)_samename_stillsame#mv &/filename.png &/\1.png#e'
Вы имеете в виду e
сбоку от #
? Если да, то что делает s#
? s
для string
?
В sed 's/old/new/' the
s` обозначает замену. Когда строка old/new содержит косую черту, вы можете избежать ее или использовать другой символ. Я использовал #
. Когда вы удалите последний e
команды, вы увидите, какие строки будут сделаны. e
выполнит созданные команды.
Я выбрал ваш, потому что его было легче всего "читать". Попробовал и получилось с первого раза. Спасибо