Основные проблемы с командами

Мне удалось успешно выполнить перемещение на 50 000 без такой ошибки mv bash

 ls | head -50000 | xargs -I{} sudo mv {} 01/

Забавно, это было на общем ресурсе samba, поэтому ограничение в 50 КБ связано с тем, что графический интерфейс Windows Explorer не любит более 60 КБ файлов в каталоге.

-3
02.11.2020, 01:50
1 ответ

В первую очередь нужно использовать прямые кавычки ('), а не типографские, как отмечает steeldriver.

Во-вторых, наличие или отсутствие кавычек влияет на то, что получает сама команда:

Например, у вас может быть:

echo 'semicolon ; echo message'

Здесь команда echo¹ запускается с параметром semicolon ; echo message. Таким образом, на выходе будет строка, говорящая

semicolon ; echo message

Теперь предположим, что кавычек не было:

echo semicolon ; echo message

Эхо программы будет функционировать точно так же, как (при печати параметра ). Однако разница в том, что, поскольку ;является специальным символом для оболочки, сама оболочка будет обрабатывать эту строку по-разному, как две команды:

  • эхо-точка с запятой
  • эхо-сообщение

Результатом будет:

semicolon message

В ваших строках есть три места, которые можно цитировать или нет:

  • {}

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

  • ;

findтребует ;для завершения одного -аргумента -exec. Поскольку ;является специальным для оболочки, его нужно заключать в кавычки (как \;, ';'или ";", это не имеет значения, только не как литерал;).В противном случае _оболочка _интерпретировала бы это как команду поиска, а затем вторую команду, начинающуюся с канала (|), что приводит к ошибке оболочки:

syntax error near unexpected token `|'

  • Shell script

Для grepу вас есть два очень разных выхода. В первом случае вы вызываете grep с одним аргументом (Shell script). В другом он вызывается с двумя аргументами (первый Shell, второйscript). Учитывая то, как работает grep, в первом случае он будет искать строки, полученные на его вход, которые содержат текст Shell script . Во втором — поиск строк, содержащих текст Shell в файле с именем script. Это совсем другое поведение.

Эта информация должна помочь вам понять, какая строка будет правильной, и почему она написана именно так.

¹ На самом деле будет вызвана встроенная оболочка, но давайте предположим, что работает автономная /bin/echo.


Наконец, правильная строка делает три вещи.

  • Запустите командуfile_для каждого файла в вашей системе`
  • Выберите те строки (, которые описывают те файлы, )которые содержат текст Сценарий оболочки
  • Подсчет количества строк (и, следовательно, сценариев оболочки)

(последняя команда будет эквивалентна использованиюgrep -c)

Таким образом, вы не получите вывод команды (, который представляет собой число ), пока не запустите программу тысячи и тысячи раз (по одному на запись в вашей файловой системе ), поэтому это совершенно нормально, что запуск занимает много времени .

Вы можете запустить его внутри папки, пропустив /, чтобы он искал только это поддерево.

Еще один способ увидеть, что он делает, — вставить tee /dev/stderrв конвейер:

find / -type f -exec file {} \; | tee /dev/stderr | grep "Shell script" | wc -l
1
18.03.2021, 22:53

Теги

Похожие вопросы