Я пытаюсь обнулить (обрезать) все файлы в папке или поддереве, которые соответствуют шаблону. В другом посте было рекомендовано использовать метод find … -exec over for variable in wildcard , который получил высокие отзывы. Однако, когда я попробовал метод find … -exec , я не смог заставить его работать для файлов с пробелами в их именах.

Два метода попытались:

for метода (работ):

for x in *.wav; do echo -n "" > "$x"; done

find метод (нужна помощь):

find . -type f -iname \*.wav -exec > "{}" \;

который дает

find: invalid argument `;' to `-exec'

и создает файл с именем {} из нулевых байтов.

Обратите внимание, что замена > "{}" на echo {} выводит список файлов в папке, поэтому синтаксис близок. Просто нужно выяснить, как уменьшить ошибку с разнесенными именами файлов.

2 ответа2

1

Проблема с командой find том, что она ожидает -exec для обработки > , но find … -exec обрабатывает только простые команды.  Только оболочка умеет интерпретировать > .  (Хорошо, может быть одна или две другие программы, которые могут сделать это, но find это не одна из них.)

Если вы хотите что-то близкое к тому, что у вас есть, используйте

find . -type f -iname "*.wav" -exec sh -c '> "$1"' - {} \;

в котором вы указываете find для выполнения оболочки, и вы используете -c чтобы указать оболочке выполнить c ommand, состоящий из > за которым следует имя файла.  Я бы порекомендовал вам сделать что-то попроще:

find . -type f -iname "*.wav" -exec cp /dev/null {} \;
0

Вам не нужно заключать в кавычки конструкцию {} в find -exec:

find . -type f -name '* *' -exec ls {} \;

Вы не можете использовать > в find -exec , он просто хочет команду и параметры. Создайте скрипт для вызова find -exec если вам это нужно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .