Вы, похоже, относитесь *.o
и *.hi
к каким-то фильтрам, которыми пользуетесь mv
. Это не так, как это работает. Инструмент ожидает пути. Ваша оболочка может расширяться *.o
и *.hi
на все подходящие локальные пути из текущего каталога; если бы это работало, mv
увидели бы пути, а не шаблоны. Очевидно, у вас нет подходящих файлов, поэтому эти шаблоны не раскрываются и становятся mv
такими, как они есть, следовательно
mv: cannot stat '*.o': No such file or directory
и т.п.
Этот синтаксис может работать:
mv ./src/*.o ./src/*.hi ./obj/
Тем не менее он (в некоторой степени) потерпит неудачу, если в нем нет подходящих файлов ./src
. Вы можете ввести переменные, как вы это сделали, но
- вам, вероятно, не нужно
$(pwd)
, srcpath="./src"
должно быть достаточно; как правило, вы должны указывать свои переменные (но не шаблоны), например:
mv "$srcpath"/*.o "$srcpath"/*.hi "$objpath"
Если файлов слишком много, вы нажмете argument list too long
.
Использование этого альтернативного решения find
должно работать с большим количеством файлов или вообще без файлов:
find "$srcpath" -name "*.o" -o -name "*.hi" -exec mv {} "$objpath" \;
Смотрите, man 1 find
чтобы узнать, как -exec
работает. Также обратите внимание, что благодаря кавычкам строки вроде "*.o"
не раскрываются здесь оболочкой; find
получает их буквально и использует свою внутреннюю процедуру сопоставления с образцом.
Решение будет запускаться отдельно mv
для каждого файла. Мы можем передать много аргументов mv
благодаря find … -exec … {} +
синтаксису, но поскольку синтаксис требует, чтобы эти аргументы были в самом конце, мы должны mv
поддерживать -t
(это не требуется POSIX, так что вы mv
можете или не можете его поддерживать):
find "$srcpath" -name "*.o" -o -name "*.hi" -exec mv -t "$objpath" {} +