конвейерные пути через xargs к инструменту командной строки `tag`

#bash #variables #pipe #xargs

#bash #переменные #труба #xargs

Вопрос:

tag — это исполняемый файл командной строки, который позволяет пользователям macOS добавлять «тег» к файлу.

tag -a | --add <tags> <path>... Add tags to file

Я пытаюсь передать список файлов в текстовый документ, но после нескольких неудачных дней мне очень нужна помощь в синтаксисе. Единственная подсказка на странице описания такова:

Если вы планируете передавать выходные данные tag через xargs, вы можете использовать параметр -0 для каждого.

Я перепробовал десятки команд: xargs, gnu-xargs, for, while, и не могу заставить это добавлять теги к файлам в списке. Исследуя сеть, я подумал, что, возможно, возникла проблема с окончаниями строк.

Я установил dos2unix и запустил его в файле, чтобы исправить возможные проблемы с окончанием строки, но, похоже, это ничего не решило.

Если вы cd попадаете в каталог файлов, которые вы пытаетесь пометить, вам не нужно использовать полный путь к файлу.

 $ gxargs -0 -t --arg-file="/Users/john/Desktop/diffremove.txt" | tag -0 -a red

echo '13.Hours.The.Secret.Soldiers.of.Benghazi.2016.1080p.BluRay.x265'$'n''1941.1979.DC.1080p.BluRay.x265'$'n'...
  

Не понимая, как xargs передает строки, я подумал, что мне нужно поместить переменную в положение после команды, где она ищет файл tag -0 -a red <variable here>

Я пытался: $ for i in $(/Users/john/Desktop/diffremove.txt) do `tag -a red "$1"`

Я установил gnu xargs и попробовал эту команду.

 $ </Users/john/Desktop/diffremove.txt gxargs -0 sh -c 'for arg do tag -0 -a red "$arg"'
  

Редактировать:
Попытка выполнения этой команды не приводит к ошибкам, но файлы не помечены.

 $ </Users/john/Desktop/diffremove.txt xargs -0 sh -c 'for arg do `tag -0 -a red '$arg'`;done'
  

Ответ №1:

Попробуйте это

 xargs -d 'n' -a /Users/john/Desktop/diffremove.txt -I % tag -a red %
  

здесь мы используем xargs для чтения из файла (используя -a), используя замену строки на (используя %) и выполняем команду tag -a red {filename} . Возможно, вам потребуется добавить -d ‘ n’ (установка delimeter на новую строку) для разделения строк.

Однако классический способ чтения и обработки строк в файле — это использование встроенной команды чтения:

 $ while IFS= read -r p; do tag -a red $p; done < /Users/john/Desktop/diffremove.txt
  

, где IFS= part можно пропустить, если у вас нет пробелов в файле.

Комментарии:

1. Это gnu xargs?

2. Проблема заключается в том, что имена файлов превращаются в одну длинную строку, а не прерываются в новой строке.

3. да, gnu.org/software/findutils/manual/html_node/find_html / … , какой из них вам нужен?

4. Я нахожусь на Mac, но установил gnu xargs.

5. хм, попробуйте добавить опцию -d ‘ n’ в xargs