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

475
Bercovici Adrian

Привет я пытаюсь переместить все файлы с .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 
0

2 ответа на вопрос

2
chloesoe

С помощью вашей команды 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 "$" do mv $srcpath/$i $objpath done 
Таким образом, нет никакого способа выпустить коллекцию расширений для данной исходной папки? Вы должны добавить их вручную? `extension0 $ srcpath ..... extensionN $ srcpath`? Нет ли способа сделать` [extension0 ... extensionN] $ srcpath ` Bercovici Adrian 5 лет назад 0
Я отредактировал свой ответ, чтобы вы могли переместить коллекцию имен файлов chloesoe 5 лет назад 1
Большое спасибо, но не могли бы вы объяснить ** 1. ** `@` обозначает индекс? ** 2. ** когда вы пишете `$ srcpath / $ i` и` i`, например, `1`, он выбирает все файлы с расширением` * .hi`? Bercovici Adrian 5 лет назад 0
** 1. ** да, @ - это индекс. ** 2. ** да, вы можете изменить скрипт для тестирования и запуска `mv $ srcpath / $ $ objpath`, и тогда будут перемещены только файлы * .hi chloesoe 5 лет назад 0
2
Kamil Maciorowski

Вы, похоже, относитесь *.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" {} +