Как перебрать файлы в директории, изменить путь и добавить суффикс к имени файла
Я столкнулся с проблемой, когда мне нужно написать скрипт для запуска моей программы с различными аргументами. В данный момент я запускаю свою программу следующим образом:
./MyProgram.exe Data/data1.txt [Logs/data1_Log.txt]
Я хочу реализовать это в виде псевдокода:
для каждого имени файла в /Data сделать
для i от 0 до 3 включительно, увеличивая i на 1
./MyProgram.exe Data/filename.txt Logs/filename_Log{i}.txt
конец цикла
конец цикла
Как мне создать второй аргумент на основе первого так, чтобы он выглядел как dataABCD_Log1.txt
, и запустить мою программу с этим аргументом?
2 ответ(ов)
Несколько замечаний сначала: когда вы используете Data/data1.txt
в качестве аргумента, действительно ли это должно быть /Data/data1.txt
(с ведущим слэшем)? Также должен ли внешний цикл искать только .txt файлы или все файлы в /Data? Вот ответ, предполагая, что нужно работать с /Data/data1.txt
и только с .txt файлами:
#!/bin/bash
for filename in /Data/*.txt; do
for ((i=0; i<=3; i++)); do
./MyProgram.exe "$filename" "Logs/$(basename "$filename" .txt)_Log$i.txt"
done
done
Примечания:
/Data/*.txt
разворачивается в пути текстовых файлов в /Data (включая часть/Data/
)$( ... )
выполняет команду оболочки и вставляет ее вывод в эту точку командной строкиbasename somepath .txt
возвращает базовую часть somepath, удаляя .txt с конца (например,/Data/file.txt
→file
)
Если вам нужно запустить MyProgram с Data/file.txt
, а не с /Data/file.txt
, используйте "${filename#/}"
, чтобы убрать ведущий слэш. С другой стороны, если вы действительно хотите сканировать Data
, а не /Data
, просто используйте for filename in Data/*.txt
.
Если вы хотите выполнить команду для каждого файла с расширением .txt
, можно использовать следующий Bash-скрипт:
for f in *.txt; do echo ${f}; done
Этот код переберет все файлы с расширением .txt
в текущем каталоге и выведет их имена на экран.
Обратите внимание, что если у вас нет файлов с таким расширением, цикл просто ничего не сделает.
Если у вас есть дополнительные вопросы или вам нужно что-то более специфичное, не стесняйтесь спрашивать!
Извлечение имени файла и расширения в Bash
Как изменить цвет вывода echo в Linux
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как работает "cat << EOF" в bash?
Передача параметров в функцию Bash