Вопрос или проблема
В каталоге “Загрузки” у меня есть две папки v1 и v2. Вывод следующего сценария помещается в v1 вместо “Загрузки”. Почему? Я запускаю сценарий из каталога “Загрузки”.
#!/usr/bin/env bash
# Полный путь к v1
v1='/mnt/c/Users/myusername/Downloads/v1'
# Полный путь к v2
v2='/mnt/c/Users/myusername/Downloads/v2'
# Проходим по файлам в v1 и сравниваем с v2
for file in "$v1"/*
do
if [ -f "$file" ]; then
fileInv2=$(find "$v2" -type f -iname "$(basename "$file")")
if [ -f "$fileInv2" ]; then
sort "$file" "$fileInv2" | uniq -u > "${file}_Diff_Output.txt"
fi
fi
done
Q2) Возможно ли создать папку с именем “…../Downloads/output” и перенаправить файлы вывода в папку output. Четыре точки означают, что начальный путь может быть любым. Поскольку я запускаю сценарий из папки “Загрузки”, я хочу, чтобы файлы вывода попадали в “…../Downloads/output”
Файл вывода записывается в папку v1
потому что вы указываете вывод как
> "${file}_Diff_Output.txt"
и ${file}
— это полный путь к входному файлу, который находится в v1
(из for file in "$v1"/*
).
Вы можете указать файл вывода в другой папке с помощью конструкции, как
> "...../Downloads/output/$(basename "$file")_Diff_Output.txt"
Возможно, вы захотите присвоить $(basename "$file")
другой переменной для ясности и простоты.
Ответ или решение
Почему выходные файлы записываются в другое место?
При выполнении вашего сценария Bash выходные файлы генерируются в каталоге v1
из-за специфики, с которой вы задаете путь для вывода. Рассмотрим основные моменты, которые влияют на данный процесс:
-
Контекст выполнения: Сценарий запускается из каталога
Downloads
, но путь для вывода файлов относительно переменнойfile
указывает на текущий файл внутри каталогаv1
. Вы используете конструкцию:> "${file}_Diff_Output.txt"
Здесь
${file}
представляет собой полный путь к файлу в каталогеv1
, что означает, что выходной файл будет записан в том же каталоге, что и входной. -
Отсутствие явного указания пути: Вы не определяете явный путь для выходных файлов. По умолчанию, если вы не укажете полный путь, файл будет создан в том каталоге, в котором находится исполняемый файл или база пути переменной.
Как перенаправить выходные файлы в другой каталог?
Для того чтобы перенаправить выходные файлы в каталог output
, который вы хотите создать внутри каталога Downloads
, вам необходимо внести следующие изменения в код:
-
Создание каталога
output
: Перед тем как выполнять ваши операции с файлами, убедитесь, что каталогoutput
существует. Вы можете это сделать с помощью командыmkdir
, добавив это в ваш сценарий:mkdir -p "${v1}/../output"
Это создаст каталог
output
в каталогеDownloads
, если он еще не был создан. -
Изменение пути для выходных файлов: Теперь вам нужно изменить строку, где определяются выходные файлы:
sort "$file" "$fileInv2" | uniq -u > "${v1}/../output/$(basename "$file")_Diff_Output.txt"
Здесь
${v1}/../output
указывает на каталогoutput
, предполагаемый как подкаталог вDownloads
, а$(basename "$file")
получает имя файла без пути, что делает его понятным для сохранения в новом каталоге.
Итог
Эти изменения позволят вашему сценарию создавать выходные файлы в нужном каталоге output
, сохраняя ясность и читабельность кода. Помните, что всегда важно явно указывать пути для выходных файлов, чтобы избежать путаницы с размещением данных.
SEO Оптимизация
Это описание отвечает не только на ваш вопрос, но и включает в себя ключевые слова, такие как "выходные файлы", "каталог вывода", "Bash сценарий", и "перенаправление файлов", что может помочь в SEO-продвижении на платформах, связанных с программированием и скриптами.