Переместить и удалить все файлы, соответствующие grep в папке - PullRequest
0 голосов
/ 23 июня 2018

Эта команда:

find buffer/ | grep -i $varname

возвращает список имен файлов. Я хочу сжать каждый из них в отдельные zip-файлы и

  • сохранить эти заархивированные файлы в папку output/ (но каждый файл имеет то же имя, что и оригинал, за исключением расширения, которое должно быть .zip)
  • удалить исходные файлы (отвечающие на find buffer/ | grep -i $varname)

Редактировать (@Cyrus):

Я стучал в это в течение 20 минут, это лучшее, что я мог придумать:

find buffer/ | grep -i $varname -exec zip "output/"'{}'.zip '{}' \;

1 Ответ

0 голосов
/ 24 июня 2018

Похоже на работу для xargs :

find buffer/ | grep -i "$varname" | xargs -n1 -I{} -- zip "output/{}.zip" {}

Для varname="" и папки buffer, созданной следующим образом:

mkdir buffer
touch buffer/1 buffer/2

Команда будет выполнена:

zip output/buffer/1.zip buffer/1
zip output/buffer/1.zip buffer/2

Возможно, вы захотите удалить часть buffer из имени файла, для этого мы можем использовать sed 's#^buffer/##'. Мы можем указать find только список файлов с -type f. Итак, следующее:

find buffer/ -type f | grep -i "$varname" | sed 's#buffer/##' | xargs -n1 -I{} -- zip "output/{}.zip" buffer/{}

выполнит:

zip output/1.zip buffer/1
zip output/2.zip buffer/2

Чтобы удалить исходные файлы, мы можем сделать что-то вроде этого:

find buffer/ -type f | grep -i "$varname" | sed 's#buffer/##' | xargs -n1 -I{} -- bash -c 'zip "output/{}.zip" buffer/{}; rm "buffer/{}"'

Если вы хотите перебирать файлы и делать что-то более сложное, вы можете использовать во время чтения строки :

find buffer/ -type f | grep -i "$varname" | sed 's#buffer/##' \
| while read -r line; do 
    zip output/${line}.zip buffer/${line}
    rm buffer/${line}
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...