2016-03-08 2 views
0

мне нужно использовать найти команду в моем сценарии, как это:Как использовать несколько параметров в поиске?

#!/bin/bash 
... 

find /root/olddir/ -name "*.log" -type f | xargs -I '{}' mv {} /root/newdir/ 

... 

Но мне нужно установить olddir/NEWDIR и использовать для нескольких директории, как это:

/root/olddir/ --> /root/newdir/ 
/root/olddir2/ --> /root/newdir2/ 
/root/olddir3/ --> /root/newdir3/ 
/root/another_olddir3/ --> /root/another_newdir3/ 
/home/old/ --> /home/new/ 
... 

Могу ли я использовать файл конф для что? Как я могу прочитать параметры на конф файл, как это:

param.conf:

#olddir;newdir 
/root/olddir/;/root/newdir/ 
/root/olddir2/;/root/newdir2/ 
/root/olddir3/;/root/newdir3/ 
/root/another_olddir3/;/root/another_newdir3/ 
/home/old;/home/new/ 
+1

Нет, 'find' не читает конфигурационный файл. Что вы на самом деле пытаетесь сделать, это мешает вам просто писать три команды отдельно? И вам действительно даже нужно найти? Если все '* .log' находятся непосредственно в каталогах'/root/olddirN/', вы можете просто их просто« mv »- не нужно« находить »или« xargs ». Последние могут быть переполнены, если файлы журналов не распределены в дереве каталогов под каждым «olddirN» (в этом случае древовидная структура не будет скопирована вашей командой). –

+1

'while IFS ="; " read -r source target; do echo "$ source $ target"; сделано Cyrus

ответ

1

Вы никогда не отвечали на мои вопросы, поэтому мне остается угадать. Я делаю следующие предположения:

  • списки папок должны быть сохранены отдельно от самого сценария, так что это не представляется возможным, чтобы поместить их непосредственно в сценарий.

  • картина соответствия между старыми и новыми именами каталогов свойственен вопрос, поставленный таким образом, что сценарий не может полагаться на это

  • вы готовы доверить формат и содержимое конфигурационного файла

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

Суть в том, что вы не можете делать то, что вы говорите, с помощью одной команды find, вам необходимо выполнить несколько команд find в соответствии с вашими спецификациями. Существует несколько альтернатив, но встроенный сценарий awk кажется хорошо подходящим для проблемы, как вы ее представили. Что-то вроде этого, возможно:

#!/bin bash 

# For convenience in case you ever want to change it, read it from 
# a command-line argument, etc: 
conffile=/etc/logcopy.conf 

# The awk script is provided inline as a heredoc. 
# Awk is instructed to use a semicolon as field separator as needed for the 
# proposed config file format. 
# The config file is given as awk's input 
awk -F ';' -f - $conffile <<'EOF' 

# skip comments 
/\s*#/ { next } 

# run the given command, where $1 and $2 are the directory names read from 
# one line of the config file 
{ system("find $1 -name '*.log' -type f | xargs -I '{}' mv {} $2") } 

EOF 
1

find не принимает параметры из конфигурационного файла

один find может работать на нескольких входах и перейти к в разных местах, но это было бы очень запутанно. было бы лучше написать немного кода оболочки для анализа файла конфигурации и выполнить для вас find.

например. что-то вроде:

CONFIG_FILE="/some/conf" 
... 
while IFS=';' read -r src dst; do 
    find "${src}" -name '*.log' -type f -exec mv {} "${dst}" \; 
done <"${CONFIG_FILE}" 
Смежные вопросы