Unix — копирование одного и того же файла из нескольких каталогов в новый каталог при переименовании файлов.

У меня есть 36 подкаталогов в одном каталоге с именами 10,11,12,....45 и журналы подкаталога

в каждом подкаталоге (кроме каталога logs) есть один и тот же файл с именем log.lampps

мне было интересно, есть ли способ, с помощью которого я мог бы скопировать каждый файл log.lampps из каждого подкаталога 10-45 и поместить его в журналы подкаталога, а также добавить номер каталога, из которого он произошел, в конец имени файла

поэтому я ищу код, который копирует файл log.lamps один за другим из каждого подкаталога, и каждый раз, когда файл копируется в журналы каталога, имя файла изменяется с log.lamps на log.lammps10, если он пришел из подкаталога 10, а при копировании файла log.laamps из подкаталога 11 в журналы его имя меняется на log.lammps11 и т. д.

любая помощь будет оценена по достоинству, так как сейчас я имею дело только с 30-40 файлами, а со временем я буду работать с сотнями файлов.


person Evan    schedule 09.10.2012    source источник
comment
Не могли бы вы принять один из ответов, если он работает для вас?   -  person Teemu Leisti    schedule 13.10.2012


Ответы (2)


Что-то в этом направлении должно работать:

for f in [0-9][0-9]/log.lammps; do
  d=$(dirname ${f})
  b=$(basename ${f})
  cp ${f} logs/${b}.${d}
done
person twalberg    schedule 09.10.2012

Это легко сделать с помощью волшебства сценариев оболочки. Я предполагаю, что у вас есть bash. Создайте новый файл в каталоге, содержащем эти подкаталоги; назовите это что-то вроде copy_logs.sh. Скопируйте и вставьте в него следующий текст:

#!/bin/bash

# copy_logs.sh

# Copies all files named log.lammps from all subdirectories of this
# directory, except logs/, into subdirectory logs/, while appending the name
# of the originating directory.  For example, if this directory includes
# subdirectories 1/, 2/, foo/, and logs/, and each of those directories
# (except for logs/) contains a file named log.lammps, then after the
# execution of this script, the new file log.lammps.1, log.lammps.2, and
# log.lammps.foo will have been added to logs/.  NOTE: any existing files
# with those names in will be overwritten.

DIRNAMES=$( find . -type d | grep -v logs | sed 's/\.//g' | sed 's/\///g' | sort )

for dirname in $( echo $DIRNAMES )
do
    cp -f $dirname/foo.txt logs/foo$dirname
    echo "Copied file $dirname/foo.txt to logs/foo.$dirname"
done

См. комментарии сценария для того, что он делает. После того, как вы сохранили файл, вам нужно сделать его исполняемым, введя команду chmod a+x copy_logs.sh в командной строке. После этого вы можете выполнить его, набрав ./copy_logs.sh в командной строке, в то время как ваш рабочий каталог — это каталог, содержащий скрипт и подкаталоги. Если вы добавите этот каталог в свою переменную $PATH, вы сможете использовать команду copy_logs.sh независимо от того, какой у вас рабочий каталог.

(Я протестировал скрипт с GNU bash v4.2.24, так что он должен работать.)

Для получения дополнительной информации о сценариях оболочки bash см. любое количество книг или интернет-сайтов; вы можете начать с Расширенного руководства по написанию сценариев Bash.

person Teemu Leisti    schedule 09.10.2012
comment
Снова взглянув на свой код, я заметил, что все имена каталогов, содержащие строку logs, будут удалены, когда будет назначена переменная DIRNAMES. Чтобы исправить это, скрипт можно было адаптировать для поиска только каталогов, имена которых состоят из цифр. Однако вместо того, чтобы полагаться на соглашения об именах каталогов, я бы переместил подкаталог logs из рассматриваемого каталога, чтобы я мог полагаться на то, что все подкаталоги имеют определенный тип — в данном случае тип, который будет содержать файл log.lammps. Это просто имеет смысл. - person Teemu Leisti; 10.10.2012