В зависимости от того, сколько предположений вы можете сделать относительно символов в именах файлов, это может быть так просто:
cp $(ls | grep -v '\.txt$') /some/other/place
Если это не сработает для вас, тогда, возможно, вместо этого можно будет использовать find ... -print0 | xargs -0 cp ...
(хотя это имеет проблемы - потому что пункт назначения находится в конце списка аргументов).
В MacOS X xargs
имеет опцию -J
, которая поддерживает то, что необходимо:
-J replstr
Если указана эта опция, xargs будет использовать данные, считанные из стандартного ввода, чтобы заменить первое вхождение replstr вместо append-
эти данные после всех других аргументов. Эта опция не влияет на количество аргументов, которые будут считаны из ввода (-n), или на размер
Команда (ы) xargs будет генерировать (-s). Опция просто перемещается туда, где эти аргументы будут помещены в выполняемые команды.
replstr должен отображаться в качестве отдельного аргумента для xargs. Он не будет распознан, если, например, он находится в середине строки в кавычках.
Кроме того, будет заменено только первое вхождение replstr. Например, следующая команда скопирует список файлов и
каталоги, которые начинаются с заглавной буквы в текущем каталоге до destdir:
/bin/ls -1d [A-Z]* | xargs -J % cp -rp % destdir
Похоже, что GNU xargs
не имеет -J
, но имеет связанную, но слегка ограничивающую опцию -I
(которая также присутствует в MacOS X):
-I replace-str
Заменить вхождения replace-str в начальных аргументах на
имена читаются из стандартного ввода. Кроме того, пробелы без кавычек не
завершить ввод элементов; вместо этого разделитель является новой строкой
персонаж. Подразумевает -x и -L 1.