У меня есть список из 417 путей к папкам, которые мне нужно объединить в определенном порядке, чтобы файлы в них перезаписывали друг друга .Вероятно, мне придется сделать это снова в будущем, когда я внесу изменения в папку, поэтому я определенно не делаю это вручную, я хотел бы узнать, как написать сценарий, который делает это.
Также, если скрипт может преобразовывать все в нижний регистр, это тоже было бы здорово. Я сделал для них архивирование без сжатия, а затем разархивировало их с помощью -LL, но было бы неплохо, если бы мне не пришлось сделайте это еще раз, так как это заняло некоторое время (17 ГБ).
Список выглядит примерно так
"/ path /"
"/ path /"
"/ path /"
(если кому-то интересно, это для слияния кучи модов для morrowind / openmw)
cp -r $(<sources) target/
должно работать.
Предполагается, что пути перечислены в файле sources
.
Каждый путь может быть путем к каталогу или файлу, но ни один путь в файле sources
не может содержать пробелы (пробел, табуляция, новая строка и т. д.) или символ подстановки оболочки (например, *
или ?
), и их не следует заключать в кавычки (если только само имя не содержит кавычек).
Вы также можете использовать что-то вроде
xargs -t -Isrc cp -r src target/ <sources
Это позволит использовать более экзотические имена файлов, но не имена файлов с переводом строки.
Ниже приведен короткий сценарий bash
, который преобразует набор имен файлов в нижний регистр (echo
следует удалить, чтобы выполнить фактическое посмотреть, что будет).
#!/bin/bash
for path in "$@"; do
dir="${path%/*}"
name="${path##*/}"
if [[ ! "$path" -ef "$dir/${name,,}" ]]; then
echo mv "$path" "$dir/${name,,}"
fi
done
Тест -ef
возвращает значение true, если два пути ссылаются на один и тот же файл (в этом случае переименование не должно происходить). Подстановка переменной ${name,,}
- это то, что фактически делает нижний регистр.
Вы можете применить это к такому каталогу:
$ find target -type f -exec bash tolower.sh {} +
Примерно так должно работать:
while IFS= read -r dir
do
cp -f "$dir"/* target
done < list
где list
— список каталогов а target
— это каталог, в который вы хотите скопировать файлы. Файлы в каталогах, которые появляются позже в списке перезапишет файлы в каталогах, которые появляются раньше в списке — cp -f
определяет опцию «принудительной перезаписи» для программы копирования. Это предполагает:
.
.