Вы можете запретить screen
бездействовать после завершения сценария, завершив оболочку после завершения сценария:
script.sh; exit
Или, если вы хотите иметь возможность просматривать сообщения об ошибках, вы можете запустить
script.sh && exit
. Таким образом, screen
закроется, только если script.sh
завершится успешно.
#!/bin/bash
OUTDIR=/opt/slm/output/
find /opt/slm/data -name data.log |
while read FILE; do
OUTFILE="$(basename "$(dirname "$FILE")")"
cp -p "$FILE" "$OUTDIR$OUTFILE"
done
решение работает только для имен каталогов без пробелов:
#!/bin/bash
targetDir=/opt/slm/output/
for myPath in `find /opt/slm/data/system |grep "data.log$"`
do
newName = `echo "$myPath" |awk 'BEGIN {FS="/"} /data.log/ {print $(NF-1)}'`
cp "$myPath" ${targetDir}"${newName}"
done
на самом деле все приведенные решения, в том числе и мое, неверны, так как приводят к потере информации для каталогов:
a/a/data.log
a/data.log
b/a/data.log
все будут иметь имя "а" и будут перезаписаны последним файлом b/a/data.log
эта проблема решается программой-примером на python3:
import os
for x in (os.walk('/opt/slm/data/system')):
if x[2] == ['data.log']:
newName=x[0].replace('/','#').replace(' ','_')
os.system('cp "'+str(x[0])+'/data.log" /opt/slm/output/'+str(newName))
Создает имена, содержащие полный путь и символ _вместо пробела:
#opt#slm#data#system#dirname
Конечно, имена и пути должны быть адаптированы к вашим потребностям.
Сzsh
:
autoload zmv # best in ~/.zshrc
zmv -n -C '**/(*)/data.log' '/opt/slm/output/$1'
удалите-n
(для пробного прогона ), если все устраивает.
-C
предназначен для копирования(в отличие от переименовать / mv
), хотя в вашем описании сказано переименовать , похоже, вы хотите вместо этого скопируйте файлы в каталог output
.
Используйтеfind -exec
:
find /opt/slm/data -name data.log -exec sh -c '
TARGET="/opt/slm/output/$(basename "$(dirname "$1")")";
cp -i "$1" "$TARGET"
' find-sh {} \;