Проблема состоит в том, что я должен петлять, но не изменяю свой текущий каталог. Таким образом, я попробовал это и работал:
cd execution/ && ./configure
Вы можете использовать следующий скрипт для копирования файлов из одного места в другое с измененным именем.
Примечание. В следующем скрипте мы жестко закодированы два значения.
/ logfiles / : - Изменение имени logfiles для действительного имени папки, из которого вы должны скопировать файлы.
/ TMP / : - Это каталог, в котором вы хотите скопировать файлы. Измените это имя каталога в соответствии с вашими требованиями.
#! / Bin / bash
Найти / logfiles / -maxdepth 1 -тип f | #find Все файлы, расположенные под папками logfiles с maxdepth.
Пока прочитайте filedir # allow все файлы строки по строке.
делать
Dir = "$ {filedir% / *}" # получить имя папки его внутри
# echo $ dir
File = "$ {filedir / * \ /}" # Получить имя простого файла.
# echo $ файл
Newfile = "$ {dir}" _ "$ {file}" # Установите новый файл.
# echo $ newfile
echo -e "Cправка $ файла из $ dir в / tmp с именем $ newfile \ n"
CP $ DIR / $ File / TMP / $ NewFile # Copy файл из старого местоположения в новое место с измененным именем.
Готово
Обычный ответ оболочки POSIX:
#!/bin/sh
for i in */*.log
do mv "$i" "${i//\//_}"
done
перемещает каждый файл, соответствующий */*.log
на одно и то же имя с заменой /
на _
.
Zsh поставляется с функцией zmv
, которая позволяет легко перемещать или копировать файлы и применять шаблонные преобразования к имени. Запишите это в свой .zshrc
(или запустите его в командной строке):
autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'
Тогда ваше копирование с помощью переименования можно выполнить любой из следующих эквивалентных команд:
zcp 'Logfiles/(*)/(*.log)' 'destination_directory/${1}_$2'
zcp -w 'Logfiles/*/*.log' 'destination_directory/${1}_${2}.log'
zcp -W 'Logfiles/*/*.log' 'destination_directory/*_*.log'
Если вы не хотите устанавливать zsh, вы можете сделать то же самое с помощью цикла в любом shell'е:
cd Logfiles
for x in */*.log; do
cp -- "$x" "destination_directory/${x%/*}_${x##*/}"
done
С pax
:
pax -'rws|/|_|' -- */u_ex150407.log target/dir
pax
является стандартным файловым архиватором, заданным POSIX. К сожалению - хотя он требуется в Linux Standard Base и был для нескольких версий, по какой-то причине многие дистрибутивы не упаковывают его с установкой по умолчанию, как того требуют оба стандарта. Я считаю это позором, потому что это очень универсальный инструмент.
Выше я говорю pax
перейти в -r
ead и -w
rite mode (что переводится в копию) и - при именовании его выходных файлов - в -s
создать первый /
в любом из его именованных параметров файла-копии с помощью _
. В принципе там можно делать стандартный синтаксис BRE -s
(за исключением того, что здесь допустимы буквальные новые строки в левой части), но в этом случае нет необходимости в деталях.
В любом случае, это все, что вам нужно. Если по какой-то причине вы не установили его, я рекомендую вам взять его и попробовать pax
.