Перемещение файлов с расширением от источника к месту назначения

Здравствуйте, я пытаюсь переместить все файлы с .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" {} +
Другие вопросы по тегам