Мне удалось успешно выполнить перемещение на 50 000 без такой ошибки mv bash
ls | head -50000 | xargs -I{} sudo mv {} 01/
Забавно, это было на общем ресурсе samba, поэтому ограничение в 50 КБ связано с тем, что графический интерфейс Windows Explorer не любит более 60 КБ файлов в каталоге.
В первую очередь нужно использовать прямые кавычки ('
), а не типографские, как отмечает 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