2

(К вашему сведению, у меня очень мало знаний о скриптах оболочки)

У меня есть тонна файлов и каталогов, которые выглядят примерно так

-root
 -dir1/a.txt
 -dir2/a.txt
 -dir3/b.txt
 -dir4/b.txt
 -dir5/c.txt

Я хотел бы иметь возможность объединить / объединить все файлы с одинаковыми именами файлов, а затем поместить все в корень. Таким образом, конечный результат будет выглядеть

-root/a.txt (combined from dir1 and dir2)
-root/b.txt (combined from dir3 and dir4)
-root/c.txt

Если это невозможно, я бы даже согласился переместить все файлы в корень и выполнить пакетное переименование. Так что-то вроде

-root/a.txt.1
-root/a.txt.2
-root/b.txt.1
-root/b.txt.2
-root/c.txt.1

Надеюсь, что это имеет смысл, и заранее спасибо :)

1 ответ1

0

Если вы хотите объединить их и имена файлов известны заранее, вы можете попробовать что-то вроде:

for i in a b c d
do
find <root direcoty> -iname "$i.txt" -exec cat {} \; > <root directory>/$i.txt
done

Для каждого a, b, c и d мы ищем файлы с именем a.txt (b.txt ... d.txt) во всех каталогах и вызываем cat для имен файлов и направляем вывод в один файл с тем же именем в корневом каталоге.

Если они не известны заранее, это немного сложно, но здесь:

for i in `find <root directory> -type f | sed -E 's!\./.*/([a-zA-Z0-9]+)\.txt!\1!g'`
do
find <root directory> -iname "$i.txt" -exec cat {} \; > <root directory>/$i.txt
done

Это то же самое, что и команда ранее, за исключением того, откуда мы получаем наш список. Сначала мы получаем список всех файлов в корневом каталоге, а затем удаляем все части имен файлов, чтобы они включали, например, имя файла (без direcotry и без расширения). Вы должны заметить, что это будет работать только для файлов, которые имеют строчные и прописные буквы, смешанные с числами в качестве имен, без черточек или прокрутки. Если вы хотите их, измените [a-zA-Z0-9] на [a-zA-Z0-9-_] .

Измените любой экземпляр <root directory> на нужный путь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .