Я пытаюсь немного научиться awk foo. У меня есть CSV, где каждая строка имеет формат частичное_имя_файла, путь_к_файлу. Моя цель - найти файлы (на основе частичного имени) и переместить их по соответствующим новым путям. Я хотел объединить силы find, awk и mv, чтобы добиться этого, но я застрял в реализации. Я хотел использовать awk для отделения терминов из CSV-файла, чтобы я мог сделать что-то вроде find . -name '*$1*' -print | xargs mv {} $2{}
, где $1 и $2 — это разделенные термины из CSV-файла. У кого какие идеи?
-peace
Магия Bash Shell awk/xargs
Ответы (3)
Мне кажется, вы тут что-то перепутали. {}
можно использовать только в поиске и только один раз. То есть вы не можете сделать что-то вроде 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)
$
Сделанный.
echo foo | xargs -n 1 echo mv {} {}.txt
=› mv {} {}.txt foo для меня.
- person bos; 11.11.2011
-i
от xargs -i
.
- person tripleee; 11.11.2011
echo foo | xargs -n 1 -I {} echo mv {} {}.txt
=> mv foo foo.txt
- person Joshua Goldberg; 19.12.2012
{}
более одного раза, например. find . -name file -exec mv {} {}.txt \;
действителен.
- person Milo Wielondek; 11.04.2013
Вам действительно не нужен awk для этого. На самом деле здесь нет ничего, что awk делал бы лучше, чем оболочка.
#!/bin/sh
IFS=,
while read file target; do
find . -name "$file" -print0 | xargs -ir0 mv {} "$target"
done <path_to_csv_file
Если у вас есть специальные символы в именах файлов, вам может потребоваться настроить read
.
как насчет использования системной команды awk:
awk '{ system("find . -name " $1 " -print | xargs -I {} mv {} " $2 "{}"); }'
пример аргументов в CSV-файле: test.txt ./subdirectory/
awk '{ system("find . -name " $1 " -print | xargs -I {} mv {} " $2 "{}"); }' path_to_csv_file
?
- person adbo; 11.11.2011