mdfind используется для создания символических ссылок, не работает должным образом - PullRequest
0 голосов
/ 18 декабря 2009

Я пытаюсь использовать вывод mdfind для создания набора символических ссылок. Вывод mdfind выглядит так:

/ pathtofile1 /
/ Pathtofile2 /
/ Pathtofile3 /

Итак, я использовал sed для добавления ln -s к началу каждой строки и awk {print $0 "/directory where I want this/"};

после того, как мой однострочный скрипт успешно выдает это:

ln -s "/ pathtofile1 /" "/ каталог, где я хочу это"
Директория ln -s "/ pathtofile2 /" "/, где я хочу это"
Каталог ln -s "/ pathtofile3 /" "/, где я хочу это"

Проблема в том, что когда я запускаю это, я получаю эту ошибку: "/ каталог, где я хочу это: файл не существует"

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

Есть идеи?

Я не думаю, что это идеальный способ сделать то, что я пытаюсь сделать, поэтому дайте мне знать, если у вас есть какие-то лучшие решения.


Отредактировано с дополнительной информацией.

#! /bin/bash
itemList=`mdfind -s "$1"| awk '{ print "ln -s \""$0"\" \"/Users/username/Local/Recent\""}'`
echo "$itemList"
`$itemList`

$ 1 - это тест * .savedSearch, который возвращает список файлов.

Мой результат (из эха):

ln -s "/Users/username/Dropbox/Document.pdf" "/Users/username/Local/Recent"
ln -s "/Users/username/Dropbox/Document2.pdf" "/Users/username/Local/Recent"

и ошибка, которую я получаю:

ln: "/ Users / username / Local / Recent": нет такого файла или каталога

Но, если я запускаю копию каждой строки по отдельности, ссылки создаются, как и ожидалось.

Ответы [ 2 ]

1 голос
/ 19 декабря 2009

Один из способов сделать это простым:

mdfind -0 "query" | ( cd "/Users/username/Local/Recent" ; xargs -0 -I path ln -s path . )

Это, конечно, не обрабатывает дубликаты имен файлов и т. Д.

EDIT:

Причины, по которым ваше решение терпит неудачу, заключается в том, что, во-первых, содержимое $itemList выполняется как одна длинная команда (т. Е. Перевод строки, выводимый awk, игнорируется), а затем, во-вторых, подстановка команды происходит перед кавычкой удаление. То, что фактически обработано, примерно эквивалентно:

ln '-s' '"/pathtofile1/"' '"/to"' 'ln' '-s' '"/pathtofile2/"' '"/to"' 'ln' '-s' '"/pathtofile3/"' '"/to"'

/bin/ln распознает это как:

ln [-Ffhinsv] source_file ... target_dir

Форма команды и проверка, чтобы увидеть, что последний параметр является существующим каталогом. Этот тест не пройден, потому что имя каталога включает в себя окружающие кавычки. Внимательно обратите внимание на сообщение об ошибке, которое вы сообщаете, и сравните:

$ ln a b c "/Users/username/Local/Recent"
ln: /Users/username/Local/Recent: No such file or directory
$ ln a b c '"/Users/username/Local/Recent"'
ln: "/Users/username/Local/Recent": No such file or directory

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

0 голосов
/ 19 декабря 2009

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

...