Объединение папок со сценарием

У меня есть список из 417 путей к папкам, которые мне нужно объединить в определенном порядке, чтобы файлы в них перезаписывали друг друга .Вероятно, мне придется сделать это снова в будущем, когда я внесу изменения в папку, поэтому я определенно не делаю это вручную, я хотел бы узнать, как написать сценарий, который делает это.

Также, если скрипт может преобразовывать все в нижний регистр, это тоже было бы здорово. Я сделал для них архивирование без сжатия, а затем разархивировало их с помощью -LL, но было бы неплохо, если бы мне не пришлось сделайте это еще раз, так как это заняло некоторое время (17 ГБ).

Список выглядит примерно так

"/ path /"

"/ path /"

"/ path /"

(если кому-то интересно, это для слияния кучи модов для morrowind / openmw)

0
03.06.2017, 07:52
2 ответа
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 {} +
0
28.01.2020, 04:45

Примерно так должно работать:

while IFS= read -r dir
do
    cp -f "$dir"/* target
done < list

где list— список каталогов а target— это каталог, в который вы хотите скопировать файлы. Файлы в каталогах, которые появляются позже в списке перезапишет файлы в каталогах, которые появляются раньше в списке — cp -fопределяет опцию «принудительной перезаписи» для программы копирования. Это предполагает:

  • Имена каталогов не содержат символов новой строки. (В противном случае их нельзя было бы перечислить в простом текстовом файле.)
  • Файл списка фактически не содержит кавычек.
  • В каждом каталоге есть только (обычные )файлы, не подкаталоги или специальные вещи.
  • Имена файлов не начинаются с..
0
28.01.2020, 04:45

Теги

Похожие вопросы