Bash Shell awk / xargs magic - PullRequest
       20

Bash Shell awk / xargs magic

4 голосов
/ 11 ноября 2011

Я пытаюсь выучить немного awk foo. У меня есть CSV, где каждая строка имеет формат part_file_name, file_path. Моя цель - найти файлы (основанные на частичном имени) и переместить их в соответствующие им новые пути. Я хотел объединить усилия find, awk и mv, чтобы добиться этого, но я застрял в реализации. Я хотел использовать awk, чтобы отделить термины от файла csv, чтобы я мог сделать что-то вроде
find . -name '*$1*' -print | xargs mv {} $2{}
где $ 1 и $ 2 - это разделенные члены из файла CSV. У кого-нибудь есть идеи?
-peace

Ответы [ 4 ]

5 голосов
/ 11 ноября 2011

Я думаю, у вас здесь все перемешано.{} можно использовать только для поиска, и только один раз.Т.е. вы не можете сделать что-то вроде find -name '*.jpg' -exec mv {} {}.png.

. Сделайте следующее:

$ cat korv
foo.txt,/hello/
bar.jpg,/mullo/
$ awk -F, '{print $1 " " $2}' korv
foo.txt /hello/
bar.jpg /mullo/

-F устанавливает разделитель, поэтому приведенное выше разделится с помощью ",".Затем добавьте * к именам файлов:

$ awk -F, '{print "*"$1"*" " " $2}' korv
*foo.txt* /hello/
*bar.jpg* /mullo/
**

Это показывает, что у меня есть пустая строка.Нам не нужно это совпадение, поэтому мы добавляем правило:

$ awk -F, '/[a-z]/{print "*"$1"*" " " $2}' korv
*foo.txt* /hello/
*bar.jpg* /mullo/

Хорошо выглядит, поэтому инкапсулируем все это в mv, используя подоболочку:

$ mv $(awk -F, '/[a-z]/{print "*"$1"*" " " $2}' korv)
$

Готово.

1 голос
/ 11 ноября 2011

Вам не нужен awk для этого.Здесь на самом деле нет ничего лучше, чем awk, чем оболочка.

#!/bin/sh
IFS=,
while read file target; do
  find . -name "$file" -print0 | xargs -ir0 mv {} "$target"
done <path_to_csv_file

Если в именах файлов есть специальные символы, вам может потребоваться настроить read.

0 голосов
/ 12 ноября 2016
find . -name "*err" -size "+10c" | awk -F.err '{print $1".job"}' | xargs -I {} qsub {}
0 голосов
/ 11 ноября 2011

как насчет использования системной команды awk:

awk '{ system("find . -name " $1 " -print | xargs -I {} mv {} " $2 "{}"); }'

пример аргументов в файле csv: test.txt ./subdirectory/

...