Пересечение, копия и преобразовывают имена файлов

Проблема состоит в том, что я должен петлять, но не изменяю свой текущий каталог. Таким образом, я попробовал это и работал:

cd execution/ && ./configure
4
08.04.2015, 01:20
4 ответа

Вы можете использовать следующий скрипт для копирования файлов из одного места в другое с измененным именем.

Примечание. В следующем скрипте мы жестко закодированы два значения.

  1. / logfiles / : - Изменение имени logfiles для действительного имени папки, из которого вы должны скопировать файлы.

  2. / 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 файл из старого местоположения в новое место с измененным именем.
    
    
    Готово
     
1
27.01.2020, 20:54

Обычный ответ оболочки POSIX:

#!/bin/sh
for i in */*.log
do mv "$i" "${i//\//_}"
done

перемещает каждый файл, соответствующий */*.log на одно и то же имя с заменой / на _.

1
27.01.2020, 20:54

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
2
27.01.2020, 20:54

С pax:

pax -'rws|/|_|' -- */u_ex150407.log target/dir

pax является стандартным файловым архиватором, заданным POSIX. К сожалению - хотя он требуется в Linux Standard Base и был для нескольких версий, по какой-то причине многие дистрибутивы не упаковывают его с установкой по умолчанию, как того требуют оба стандарта. Я считаю это позором, потому что это очень универсальный инструмент.

Выше я говорю pax перейти в -read и -write mode (что переводится в копию) и - при именовании его выходных файлов - в -sсоздать первый / в любом из его именованных параметров файла-копии с помощью _. В принципе там можно делать стандартный синтаксис BRE -s (за исключением того, что здесь допустимы буквальные новые строки в левой части), но в этом случае нет необходимости в деталях.

В любом случае, это все, что вам нужно. Если по какой-то причине вы не установили его, я рекомендую вам взять его и попробовать pax.

1
27.01.2020, 20:54

Теги

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