#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