8

Как перебрать файлы в директории, изменить путь и добавить суффикс к имени файла

4

Я столкнулся с проблемой, когда мне нужно написать скрипт для запуска моей программы с различными аргументами. В данный момент я запускаю свою программу следующим образом:

./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 ответ(ов)

11

Несколько замечаний сначала: когда вы используете 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.txtfile)

Если вам нужно запустить MyProgram с Data/file.txt, а не с /Data/file.txt, используйте "${filename#/}", чтобы убрать ведущий слэш. С другой стороны, если вы действительно хотите сканировать Data, а не /Data, просто используйте for filename in Data/*.txt.

0

Если вы хотите выполнить команду для каждого файла с расширением .txt, можно использовать следующий Bash-скрипт:

for f in *.txt; do echo ${f}; done

Этот код переберет все файлы с расширением .txt в текущем каталоге и выведет их имена на экран.

Обратите внимание, что если у вас нет файлов с таким расширением, цикл просто ничего не сделает.

Если у вас есть дополнительные вопросы или вам нужно что-то более специфичное, не стесняйтесь спрашивать!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь