Перемещение файлов с расширением от источника к месту назначения
Здравствуйте, я пытаюсь переместить все файлы с .hi
а также .o
расширение из целевой папки /src
в другую папку /Obj
Пока что я попробовал:
srcpath=$(pwd)"/src"
ghc src/Main.hs > Logs/output.txt 2> Logs/Err.txt //this builds the project and generates the binaries and .hi files
mv *.hi *.o $srcpath/src/ Obj/ //i want to move all these files to Obj/ folder but where do i place the extension arguments?
Как должна быть команда: mv extensions source dest ?
или же mv source dest extensions
Я пытался:
srcpath=$(pwd)"/src"
objpath=$(pwd)"/Obj"
ghc src/Company.hs > Logs/output.txt 2> Logs/Err.txt
mv *.o *.hi $srcpath $objpath
И я получаю следующую ошибку:
mv: cannot stat '*.o': No such file or directory
mv: cannot stat '*.hi': No such file or directory
mv: cannot move '/c/Users/[..]/src' to '/c/Users/[...]/Obj/src': Device or resource busy
2 ответа
С вашей командой mv *.o *.hi $srcpath $objpath
вы перемещаете каждый файл с *.o или *.hi плюс папку src из текущего $(pwd)
папка в Obj
Если вы хотите переместить все *.o и *.hi, которые находятся в папке src
тогда вы можете использовать это:
#!/bin/bash
srcpath=$(pwd)"/src"
objpath=$(pwd)"/Obj"
mv $srcpath/*.o $srcpath/*.hi $objpath
Убедитесь, что ваш скрипт bash запущен в правильной папке, поэтому $(pwd)
Команда работает правильно.
Редактировать:
Если вы хотите переместить коллекцию файлов или файлов с определенным расширением, вы можете изменить скрипт так, чтобы он выглядел так (спасибо https://stackoverflow.com/a/8880633/7311363):
#!/bin/bash
srcpath=$(pwd)"/src"
objpath=$(pwd)"/Obj"
##declare an array variable
declare -a arr=("*.o" "*.hi")
##loop trough the array to move
for i in "${arr[@]}"
do
mv $srcpath/$i $objpath
done
Вы, кажется, относитесь *.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" {} +