$ ls *mp3 | xargs mplayer
Playing Lemon.
File not found: 'Lemon'
Playing Tree.mp3.
File not found: 'Tree.mp3'
Exiting... (End of file)
Моей команде не удается потому что файл "лимонное дерево.МР3" и содержит пробелы и поэтому команды xargs думает, что это'с двумя файлами. Я могу найти + команды xargs работать с именами файлов, как это?
Команда размер
имеет пробельные символы (знаки табуляции, пробелы, новые строки) в качестве разделителей. Его можно сузить только символы новой строки ('\П') С -Д
вариант такой:
ls *.mp3 | xargs -d '\n' mplayer
Он работает только с GNU команды xargs. Для BSD систем, используйте опцию -0
, Как это:
ls *.mp3 | xargs -0 mplayer
Этот способ проще и работает с GNU команды xargs, а также.
В утилиты xargs читает пробел, табуляция, перевод строки и конца файла с разделителями строк из стандартного ввода и выполняет программу с строк в качестве аргументов.
Вы хотите избежать, используя пробел в качестве разделителя. Это может быть сделано путем изменения разделитель для команды xargs. Согласно инструкции:
-0 команды xargs изменений ожидать нуль (`\0'') символы в качестве разделителей, вместо пробелов и переводов строк. Ожидается, что это будет использоваться в концерт с -print0 команды функции Найти(1).
Такие как:
find . -name "*.mp3" -print0 | xargs -0 mplayer
Чтобы ответить на вопрос об игре седьмой МР3; это проще для запуска
mplayer "$(ls *.mp3 | sed -n 7p)"
Попробовать
find . -name \*.mp3 -print0 | xargs -0 mplayer
вместо
ls | grep mp3
размер на macOS не'т иметь опцию-D, так что это решение использует -0 вместо.
Сделать LS в выходной файл для каждой линии, а затем перевести строку в нули и сказать команды xargs для использования значения NULL в качестве разделителя:
команды ls -1 *припев МР3 | тр &;\П" и " и\0" и | команды xargs -0 и mplayer
Дик.Guertin'ы ответ [1] предположил, что можно избежать пробелов в имени является полноценной альтернативой другим решениям, предложенные здесь (например, с помощью нуль-символ в качестве разделителя, а не пробелы). Но это может быть проще - вы Дон'т действительно нужен уникальный характер. Вы можете просто СЭД добавить бежал пространства напрямую:
ls | grep ' ' | sed 's| |\\ |g' | xargs ...
Кроме того, грэп необходимо только если вы хотите только файлы с пробелами в именах. Более обобщенно (например, при обработке пакетных файлов, которые могут содержать пробелы, некоторые нет), просто пропустить команды grep:
ls | sed 's| |\\ |g' | xargs ...
Потом, конечно, имя файла может иметь и другие пробелы не пробелы (например, вкладки):
ls | sed -r 's|[[:blank:]]|\\\1|g' | xargs ...
Предполагается, что у вас есть sed, что поддерживает -Р (расширенное регулярное выражение), таких как GNU sed или последних версий BSD СЭД (например, операционной системы, которая изначально прописана опция, что " Е" и до FreeBSD 8 и поддерживает как -R &ампер; -E для совместимости с FreeBSD 11 по крайней мере). В противном случае вы можете использовать регулярное выражение основной класс персонажа выражение в квадратных скобках и вручную введите символы пробела и табуляции в []
разделители.
[1] Это, пожалуй, более уместно в качестве комментария или редактирования этого ответа, но на данный момент я не имею достаточно репутации, чтобы комментировать и могу только рекомендовать изменения. Поскольку последняя выше формы (без поиска) изменяет поведение Дика.Guertin'ы оригинальный ответ, прямое редактирование-это, пожалуй, не уместно.
find . -name 'Lemon*.mp3' -print0 | xargs -0 -i mplayer '{}'
Это помогло в моем случае для удаления разных файлов с пробелами. Он должен работать с mplayer. Необходимые хитрость заключается в кавычки. (Проверено на Linux Xubuntu в 14.04.)
команды ls | grep в формате mp3 | СЕПГ -Н "по-7р-то" | команды xargs -я mplayer'ом {}
Обратите внимание, что в приведенной выше команде, размер
позвонит и mplayer
заново для каждого файла. Это может быть нежелательно для mplayer'А, но может быть хорошо для других целей.
На macOS 10.12.х (Сьерра), если у вас есть пробелы в имени файла или папки, вы можете использовать следующее:
find . -name '*.swift' -exec echo '"{}"' \; |xargs wc -l
Это зависит от (А), как вы привязаны к количеству 7 в отличие, скажем, лимоны, и (Б) является ли любой из ваших файлов, имена которых содержат символы новой строки (и если вы'вновь готовы переименовать их, если они делают).
Есть много способов, чтобы справиться с ней, но вот некоторые из них:
mplayer Lemon*.mp3
find . -name 'Lemon*.mp3' -exec mplayer {} ';'
i=0
for mp3 in *.mp3
do
i=$((i+1))
[ $i = 7 ] && mplayer "$mp3"
done
for mp3 in *.mp3
do
case "$mp3" in
(Lemon*) mplayer "$mp3";;
esac
done
i=0
find . -name *.mp3 |
while read mp3
do
i=$((i+1))
[ $i = 7 ] && mplayer "$mp3"
done
Чтение
петля не'т работу, если имена файлов содержат символы новой строки; другие корректно работать даже с переносами строк в названиях (не говоря уже о помещениях). За мои деньги, если у вас имена файлов, содержащих символ новой строки, вы должны переименовать файл без перевода строки. Используя двойные кавычки вокруг имени файла является ключом к петлям правильно работать.
Если у вас есть GNU найти
и GNU размер
(или FreeBSD (*БСД?), или Мак ОС Х), вы также можете использовать -print0 команды
и -0
варианты, как:
find . -name 'Lemon*.mp3' -print0 | xargs -0 mplayer
Это работает независимо от содержания имени (только два персонажа, которые не могут присутствовать в имени файла слеш и Nul, и Слэш не вызывает никаких проблем в пути, поэтому через Nul как имя разделителя охватывает все). Однако, если вам нужно, чтобы отфильтровать первые 6 записей, вам нужна программа, которая обрабатывает 'линии' завершился нул вместо строки...и я'м не уверен, что есть какие-то.
Первый на сегодняшний день самый простой для конкретного случая под рукой; однако это может не обобщать, чтобы покрыть ваши другие сценарии, которые вы'вэ еще не перечислили.
Я знаю, что я'м не отвечая на размер
вопрос напрямую но это's стоит отметить найти
'ы -exec для
вариант.
С учетом следующих файловых систем:
[root@localhost bokeh]# tree --charset assci bands
bands
|-- Dream\ Theater
|-- King's\ X
|-- Megadeth
`-- Rush
0 directories, 4 files
Команда find может быть сделано, чтобы отрегулировать пространство в Театре мечты и король's и X. Итак, чтобы найти барабанщиков каждого диапазона с помощью команды grep:
[root@localhost]# find bands/ -type f -exec grep Drums {} +
bands/Dream Theater:Drums:Mike Mangini
bands/Rush:Drums: Neil Peart
bands/King's X:Drums:Jerry Gaskill
bands/Megadeth:Drums:Dirk Verbeuren
В параметр -метод exec
{}
обозначает имя файла, включая путь. Обратите внимание, что вы Дон'т придется бежать его или положить его в кавычки.
Разница между остается
'Терминаторы С (+
и \;
) это +
группам как можно больше имен файлов, которые он может на одной командной строке. В то время как \;
будет выполнить команду для каждого файла.
Так, найти группы/ -тип F -exec для грэп барабаны {} +
приведет к:
grep Drums "bands/Dream Theater" "bands/Rush" "bands/King's X" "bands/Megadeth"
и найти полос/ -тип F -exec для грэп барабаны {} \;` приведет к:
grep Drums "bands/Dream Theater"
grep Drums "bands/Rush"
grep Drums "bands/King's X"
grep Drums "bands/Megadeth"
В случае команда grep
это имеет побочный эффект, либо распечатать именем или нет.
[root@localhost bokeh]# find bands/ -type f -exec grep Drums {} \;
Drums:Mike Mangini
Drums: Neil Peart
Drums:Jerry Gaskill
Drums:Dirk Verbeuren
[root@localhost bokeh]# find bands/ -type f -exec grep Drums {} +
bands/Dream Theater:Drums:Mike Mangini
bands/Rush:Drums: Neil Peart
bands/King's X:Drums:Jerry Gaskill
bands/Megadeth:Drums:Dirk Verbeuren
Конечно, команда grep
'опционы S -H
И -Ч
будет контролировать ли именем печатается независимо от того, как команда grep
называется.
размер
размер
также может контролировать файлы мужчину в командной строке.
размер
по группам по умолчанию все рассуждения на одну линию. Для того, чтобы сделать то же самое, что -exec будет \;
не использовать размер -Л
. Обратите внимание, что опция -т
говорит размер
, чтобы напечатать команду перед ее выполнением.
[root@localhost bokeh]# find ./bands -type f | xargs -d '\n' -l -t grep Drums
grep Drums ./bands/Dream Theater
Drums:Mike Mangini
grep Drums ./bands/Rush
Drums: Neil Peart
grep Drums ./bands/King's X
Drums:Jerry Gaskill
grep Drums ./bands/Megadeth
Drums:Dirk Verbeuren
Вижу, что опция -л
говорит команды xargs для выполнения команды grep для всех именем.
Против по умолчанию (параметр т. е. нет -л
):
[root@localhost bokeh]# find ./bands -type f | xargs -d '\n' -t grep Drums
grep Drums ./bands/Dream Theater ./bands/Rush ./bands/King's X ./bands/Megadeth
./bands/Dream Theater:Drums:Mike Mangini
./bands/Rush:Drums: Neil Peart
./bands/King's X:Drums:Jerry Gaskill
./bands/Megadeth:Drums:Dirk Verbeuren
размер
имеет лучший контроль того, сколько файлов может быть в командной строке. Дать опцию -л
максимальное число файлов в одной команде.
[root@localhost bokeh]# find ./bands -type f | xargs -d '\n' -l2 -t grep Drums
grep Drums ./bands/Dream Theater ./bands/Rush
./bands/Dream Theater:Drums:Mike Mangini
./bands/Rush:Drums: Neil Peart
grep Drums ./bands/King's X ./bands/Megadeth
./bands/King's X:Drums:Jerry Gaskill
./bands/Megadeth:Drums:Dirk Verbeuren
[root@localhost bokeh]#
Вижу, что команда grep
был казнен с двумя именами, потому что из-Л2`.
Учитывая конкретные названия этой должности, здесь'ы мое предложение:
ls | grep ' ' | tr ' ' '<' | sed 's|<|\\ |g'
Идея заключается в преобразовании заготовки для любого уникального персонажа, как '<', а затем изменить это в '\ ', обратная косая черта, за которой следует пробел. Затем можно передать в любую команду, которую вы хотите, такие как:
ls | grep ' ' | tr ' ' '<' | sed 's|<|\\ |g' | xargs -L1 GetFileInfo
Ключ здесь лежит в 'тр' и 'ООО' команды; и вы можете использовать любой символ, кроме '<', Как '?' или даже плата-характер.
Альтернативные решения могут быть полезны...
Вы также можете добавить нулевой символ в конец строки, используя Perl, а затем использовать опцию -0
в размер. В отличие от команды xargs -д '\П' (в утвержденных ответа) - это работает везде, в том числе ОС&ампер;усилитель; nbsp;Х.
Например, рекурсивно список (выполнение, перемещение и т. д.) JPEG-изображений, которые могут содержать пробелы или другие забавные персонажи - Я'd с помощью:
find . | grep \.jpg | perl -ne 'chop; print "$_\0"' | xargs -0 ls
(Примечание: для фильтрации, я предпочитаю проще запомнить, что "| грэп-то" синтаксис, чтобы "найти'ы с" --название аргументы.)