Особый случай «копирования и переименования»

Вы можете запретить screen бездействовать после завершения сценария, завершив оболочку после завершения сценария:

script.sh; exit

Или, если вы хотите иметь возможность просматривать сообщения об ошибках, вы можете запустить

script.sh && exit

. Таким образом, screen закроется, только если script.sh завершится успешно.

0
24.05.2019, 20:32
4 ответа
#!/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
1
28.01.2020, 02:40

решение работает только для имен каталогов без пробелов:

#!/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

Конечно, имена и пути должны быть адаптированы к вашим потребностям.

-1
28.01.2020, 02:40

Сzsh:

autoload zmv # best in ~/.zshrc
zmv -n -C '**/(*)/data.log' '/opt/slm/output/$1'

удалите-n(для пробного прогона ), если все устраивает.

-Cпредназначен для копирования(в отличие от переименовать / mv), хотя в вашем описании сказано переименовать , похоже, вы хотите вместо этого скопируйте файлы в каталог output.

1
28.01.2020, 02:40

Используйте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 {} \;
1
28.01.2020, 02:40

Теги

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