2015-11-22 8 views
0

У меня есть скрипт, который запрашивает API Twitter для нескольких запросов, а затем записывает необработанные данные в файл с запросом в имени, плюс метка времени. Я хотел бы иметь скрипт, который, учитывая список строк запроса (регулярные выражения?) И для всех файлов в папке, если одна из строк запроса является подстрокой в ​​этом файле, переместите ее в определенную папку. Прямо сейчас у меня есть только сценарий с несколькими десятками команд mv, но мне нужна более простая и удобная версия. Вот пример того, что я делаю сейчас:Bash: переместить файлы в определенную папку, если имя содержит один из списка строк

mv /home/nick/TwitterSearchToDatabase/queries_for_amita/*femin*/home/nick/TwitterSearchToDatabase/queries_for_amita/feminism 
mv /home/nick/TwitterSearchToDatabase/queries_for_amita/*patriarchy* /home/nick/TwitterSearchToDatabase/queries_for_amita/feminism 
mv /home/nick/TwitterSearchToDatabase/queries_for_amita/*yesallwomen* /home/nick/TwitterSearchToDatabase/queries_for_amita/feminism 
mv /home/nick/TwitterSearchToDatabase/queries_for_amita/*womanpower* /home/nick/TwitterSearchToDatabase/queries_for_amita/feminism 
+0

Вы можете сделать эти перемещения в одной команде для начала. 'mv glob1 glob2 glob3 dest' –

+0

Для удобства чтения и удобства обслуживания лучше сохранить общие сегменты путей в параметрах оболочки. – 4ae1e1

ответ

2

Я хотел бы использовать для цикла:

for i in femin patriarchy yesallwomen womanpower; do 
    mv /home/nick/TwitterSearchToDatabase/queries_for_amita/*$i* /home/nick/TwitterSearchToDatabase/queries_for_amita/feminism 
done 

Таким образом, список в первой строке так легко изменить.

+0

Спасибо, это именно то, что я искал. – nicolashahn

2

Я бы выделил данные (слова, которые нужно переместить в феминизм) и код. Когда у вас больше ключевых слов (феминизм и т. Д.), Вы можете создавать файлы с ключевыми словами и проверять эти файлы ключевых слов для файлов, которые вы планируете переместить. С $ {fromdir}, где файлы берутся, $ {todir}, где вы хотите их и $ {} keyfiledir с ключевыми словами, вы получите что-то вроде

for keyfile in ${keyfiledir}/*; do 
    key="${keyfile##*/}" 
    find $from -type f | sed 's#.*/##' | while read -r file; do 
     echo "${file}" | grep -q -f "${keyfiledir}"/"${key}" && mv "${from}"/"${file}" "${to}"/"${key}" 
    done 
done 

Как это работает? Я протестировал решение выше со следующим скриптом.

from=fromdir 
to=todir 
keyfiledir=keyfiledir 
rm -rf ${from} ${to} ${keyfiledir} 
mkdir ${from} ${to} ${keyfiledir} 
mkdir ${to}/feminism ${to}/so 
touch ${from}/yesallwomen ${from}/women ${from}/some_femin ${from}/"help move" 
cat <<@ > ${keyfiledir}/feminism 
femin 
patriarchy 
yesallwomen 
womanpower 
@ 
touch ${from}/yesallwomen ${from}/women ${from}/some_femin 

cat <<@ > ${keyfiledir}/so 
stack 
exchange 
help 
@ 

test ! -d "${from}" && echo " Wrong dir ${from}" && exit 1 
test ! -d "${to}" && echo " Wrong dir ${to}" && exit 1 
test ! -d "${keyfiledir}" && echo " Wrong dir ${keyfiledir}" && exit 1 

for keyfile in ${keyfiledir}/*; do 
    key="${keyfile##*/}" 
    find $from -type f | sed 's#.*/##' | while read -r file; do 
     echo "${file}" | grep -q -f "${keyfiledir}"/"${key}" && mv "${from}"/"${file}" "${to}"/"${key}" 
    done 
done 

echo "Not moved" 
ls ${from} 
echo "Moved" 
ls -R ${to} 
1

Простая комбинация mv и egrep должно быть достаточно. egrep может взять список шаблонов из файла (а затем вы получите полный синтаксис regexp, а не только синтаксис glob.) Убедитесь, что вы исключили имя целевой папки.

cd /home/nick/TwitterSearchToDatabase/queries_for_amita 
mv $(ls | egrep -f patterns.txt | grep -v '^feminism$') feminism