2015-11-25 3 views
0

У меня буквально нет опыта в сценариях unix и shell, но мне нужно заполнить 100 похожих папок теми же файлами с разницей только в определенном тексте.Скопируйте и замените текст с помощью файла SH

Например, у меня есть папка «dataxxx», в которой есть 2 файла. Мне нужно скопировать эту папку в data1, data2, data3, ..., data100. Файлы внутри них - это простые текстовые файлы, где мне нужно заменить все экземпляры dataxxx на имя папки (data1, data2, data3, ..., data100).

+0

Добро пожаловать в StackOverflow! Пожалуйста, приложите максимум усилий. – ChuckCottrill

ответ

1

Вот первый пример того, как выполнить свою задачу. Обратите внимание, что этот пример легко обобщается на любой символ, а не только на числа {1..100} и иллюстрирует много полезных идиом оболочки.

Сначала создайте файл со 100 записями, по одному на каждую строку (вы можете использовать редактор, или файл может быть результатом запроса к базе данных и т. Д.).

cat > list <<HERE 
1 
2 
3 
... 
100 
HERE 

(Приведенное выше показывает, как создать файл без редактора и может быть помещен в скрипт).

Или вы можете использовать скрипт для подсчета (см ответ Дэвида Ранкина) и т.д.

for i in $(seq 1 100); do echo $i; done > list 

Затем короткий скрипт для выполнения копирования и т.д. для каждого элемента списка,

for number in `cat list`; do 
    symbol="data$number"; #construct string from variable, constant text 
    mkdir $symbol; #make the directory you need 
    cp -p dataxxx/* $symbol/; #copy your template files 
    #now you need to edit each file in directory $symbol/ 
    for file in `ls $symbol`; do 
     sed -i ‘s/dataxxx/$symbol/g’ $file; #rewrite your template files 
    done 
done 

Использование СЭД, чтобы сделать изменения - изменить все экземпляры слова в файле команда

sed -i ‘s/original_word/new_word/g’ file.txt 

«g» в конце говорит sed выполнить действие по всему миру.

+0

Нет необходимости создавать файл; существует несколько способов генерации последовательности чисел, в зависимости от того, какая оболочка используется. –

+1

Согласен, но перейдите meta и поймите, что у вас есть кто-то новый на сайте, который нуждается в некоторой помощи и руководстве, и это показывает им немного больше о том, как использовать sh. Это решение полностью обобщается на любые символы, а не только на числа. – ChuckCottrill

+1

Не перегибайте обратные метки. Предпочтительной идиомой является 'while read -r stuff; делать ...; done <файл' – tripleee

0

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

mkdir ~/Desktop/data{1..100} 

for d in ~/Desktop/data{1..100}; do 
    cp -a ~/Desktop/dataxx "$d" 
done 

сохранить его в файл с именем copy.sh и запустить его bash copy.sh (проверено на ubuntu Различная дистрибутив может отличаться процедура запуска sh файл посмотреть.) Это работает для меня. Ответ, если он работает. более подробно см. с помощью терминала man cp

+0

Сначала вы должны попробовать, а затем задать вопрос. Поскольку вы новичок, я пробовал. –

0

Вот еще один, который использует seq и содержит проверку ошибок/проверку ввода и создания каталога. Вы можете выбрать, следует ли удалить первоначальный dataxxx каталог в конце раскомментировав команду rm:

#!/bin/sh 

[ -d "$1" ] || { ## validate source directory given 
    printf "error: insufficient input, usage: %s srcdir\n" "${0//*\//}" 
    exit 1 
} 

for i in $(seq 1 100); do 
    newdir="data$i"    ## form new directory name from seq val 
    mkdir -p "$newdir" || {  ## create new directory data1 - data100 
     printf "error: directory creation failed '%s'\n" "$newdir" 
     exit 1 
    } 
    cp -a "$1"/* "$newdir"  ## copy contents of dataxxx to $newdir 
done 

# rm -f "$1" ## optionally remove original source directory 
Смежные вопросы