Это может быть намного более просто. Я понятия не имею, с чем Вы - Тринг, чтобы сделать {print $folder}
: фигурные скобки не имеют никакого смысла здесь, и при попытке включать $folder
в строке Вы просто записали бы $folder
. Вы не должны анализировать вывод ls
, это очень редко полезно и часто перестало работать.
if ! ssh user@host "test -e '/usr/local/username/$folder'"; then
# the file doesn't exist
Обратите внимание, что имя файла должно быть заключено в кавычки для удаленной оболочки. Я главным образом заботился об этом в своей команде выше путем окружения имени файла в удаленной команде с одинарными кавычками, но который только работает если $folder
самостоятельно не содержит одинарных кавычек. Если Ваша локальная оболочка является ударом, ksh93 или zsh, используйте это вместо этого, для заключения в кавычки любой одинарной кавычки:
q=\'\\\'\'
if ! ssh user@host "[ -d '/usr/local/username/${folder//\'/$q}' ]"; then
Другой подход, который обычно более удобен, должен смонтировать удаленную файловую систему с sshfs и работой над ним через нормальный интерфейс файловой системы. Я рекомендую это, если Вы не работаете с большим количеством удаленных серверов одновременно.
mkdir /path/to/mount/point
sshfs user@host /path/to/mount/point
if ! [ -d "/usr/local/username/$folder" ]; then
Самый легкий путь, принимая все соответствующие файлы находится в том же каталоге:
for f in *; do ebook-meta "$f" --tags rhubarb
Если файлы могут быть в различных подкаталогах, использовать find
(это предполагает, что единственные файлы во всех подкаталогах являются электронными книгами. Так как это вероятно не верное, необходимо использовать что-то дополнительное как -name "*.ebook"
или безотносительно расширения Ваши электронные книги имеют):
find . -type f -exec ebook-meta '{}' --tags rhubarb \;
У Вас должны быть электронные книги автора в каталоге. cd
к этому каталогу выполнение:
for var in $(ls); do ebook-meta $var --tags rhubarb; done
если имя файла имеет пробелы, необходимо изменить IFS (Внутренний Разделитель полей):
oldIFS=$IFS
IFS='\n'
for var in $(ls); do ebook-meta $var --tags rhubarb; done
IFS=$oldIFS
Или то же в единственной команде:
oldIFS=$IFS && IFS='\n' && for var in $(ls); do ebook-meta $var --tags rhubarb; done && IFS=$oldIFS
ls
, и дважды никогда не работая с именами файлов, которые, вероятно, будут иметь пробелы.
– terdon♦
01.09.2013, 17:13
-
прежде-exec
, попробуйте еще раз с измененным ответом. – terdon♦ 01.09.2013, 20:20